Android中软键盘弹出后,通常只能通过返回键来将其收起来(有些输入法自己在键盘的上方增加了一个按钮,点击后可以隐藏软键盘,不过这不是通用的方法,很多输入法并没有实现这样的功能)。比较好的做法是,让用户可以点击键盘外的任意空白区域来隐藏软键盘。
实现方法很简单,只需要重写Activity的onTouchEvent()方法,在onTouchEvent()方法中判断,如果当前软键盘是显示状态,就将其隐藏。
这里涉及到两个问题:
1. 如何判断软键盘是否是显示状态
2. 如何隐藏软键盘
这两个问题在前两篇博文中已经详细的分析了,这里只需要直接使用就可以了。
示例代码如下。
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mIsSoftKeyboardShowing) {
InputMethodManager imm = (InputMethodManager) ContextUtil.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}
return true;
} else {
return super.onTouchEvent(event);
}
}
mIsSoftKeyboardShowing表示当前软键盘处于显示状态。
这样重写onTouchEvent后,就可以实现点击任意空白区域隐藏软键盘。
需要注意的是,这里实现的是点击任意空白区域隐藏软键盘,而不是点击任意区域隐藏软键盘。当点击软键盘所在区域时,软键盘会消费本次点击事件,产生文字输入;当点击软键盘外的EditText时,EditText会消费本次点击事件,改变输入光标的位置;当点击软键盘外设置了OnClickListener的Button、ImageView时,Button、ImageView会消费本次点击事件,执行相应的OnClick方法。。。所有的这些操作都不会触发Activity中的onTouchEvent(),只有点击到空白区域时,才会触发Activity中的onTouchEvent()。这涉及到TouchEvent的分发机制,关于TouchEvent的分发机制这里就不做介绍了。