-
搜索和删除图标:
显示可以用drawableLeft和drawableRight实现;重载onTouchEvent检测点击删除按钮的区域
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP) {
int rawX = (int) event.getRawX();
int rawY = (int) event.getRawY();
Rect rect = new Rect();
getGlobalVisibleRect(rect);
rect.left = rect.right - mDeleteDrawable.getIntrinsicWidth();//mDeleteDrawable是删除图标资源
if(rect.contains(rawX, rawY)) {
//点击区域(横向上)在删除按钮位置
}
}
return super.onTouchEvent(event);
}
-
输入法的enter变成搜索图标
除了setImeOptions(EditorInfo.IME_ACTION_SEARCH)
以外,还需要设置单行setSingleLine()
,注意这里并不是setMaxLines(1)
-
焦点与返回键的处理
焦点在输入框,消费掉返回键并且取消焦点,手动关闭输入法 ;
焦点不在输入框,按返回键,交给上层处理。
重载dispatchKeyEventPreIme可以在输入法处理返回键之前处理这个消息
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
boolean result = hasFocus();
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
clearFocus();
}
return result;
}
通过监听View.OnFocusChangeListener
来得知焦点的变化
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus) {
closeSoftInput();
}
}
注意用clearFocus取消焦点的时候,还要检查下是否在布局中存在搜索框之前的可以设置焦点的view,如果没有,焦点会再次设置到搜索框上导致输入法不消失。可以对搜索框的parent设置以下属性来解决这个问题
android:focusable="true"
android:focusableInTouchMode="true"
网友评论