点击界面隐藏软键盘
通常有一类需求,在页面中软键盘打开时,希望点击屏幕其他的任何地方,把软键盘隐藏掉。
比如登录,注册之类的常见页面。
在实际开发中,一般是通过处理其他控件的点击事件,在onClick
中调用隐藏软键盘的方法,从而达到相应效果,但是在页面复杂的时候,要实现的onClick
方法会很多,甚至还有逻辑处理冲突的情况,这样做就显得非常不友好。
下面这种方式通过监听处理全局触摸事件,以较为简洁的方式实现这个功能。
原理
通过重写Activity
的dispatchTouchEvent(MotionEvent ev)
方法,全局监听触摸事件,当点击页面时,发现如果焦点在EditText
上,就把软键盘隐藏,否则不做处理。
实现
\\...BaseActivity.java
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 过滤掉不想处理view,filterViewByIds()子类实现提供过滤的控件;
// isTouchView()表示点击事件是否发生在参数view上
if (isTouchView(filterViewByIds(), ev)) return super.dispatchTouchEvent(ev);
if (hideSoftByEditViewIds() == null || hideSoftByEditViewIds().length == 0)
return super.dispatchTouchEvent(ev);
View v = getCurrentFocus();
// hideSoftByEditViewIds()子类实现提供希望Base处理焦点判断的EditText
if (isFocusEditText(v, hideSoftByEditViewIds())) {
//隐藏键盘
KeyBoardUtils.hideInputForce(this);
clearViewFocus(v, hideSoftByEditViewIds());
}
}
return super.dispatchTouchEvent(ev);
}
其中实现方法hideSoftByEditViewIds()
, filterViewByIds()
即可实现该功能。
具体实现可以查看源代码:Github代码仓库
Reference
一行代码实现Android软键盘与EditText的交互