点击空白处隐藏软键盘主要通过以下三步操作完成:
1.判断当前焦点是否在EditText上;
2.判断用户点击的区域是否在EditText之外;
3.若焦点在EditText上并且点击区域在EditText之外,则将软键盘隐藏。
了解到以上三点之后,接下来就是具体代码实现。首先,需要找个地方来实施以上三步操作,那么这个地方无疑是dispatchTouchEvent,通过重写dispatchTouchEvent方法来获取用户的触摸操作。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Logger.print(TAG, "dispatchTouchEvent");
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
Logger.print(TAG, "dispatchTouchEvent MotionEvent.ACTION_DOWN");
// 获得当前得到焦点的View
View v = getCurrentFocus();
//如果焦点在edittext上,则隐藏软键盘
if (JudgeHideFostInput.isShouldHideInput(v, ev)) {
JudgeHideFostInput.hideSoftInput(AppActivity.this,v.getWindowToken());
}
}
return super.dispatchTouchEvent(ev);
}
接下来,判断当前焦点是否是EditText及触摸区域。
public static boolean isShouldHideInput(View v, MotionEvent event) {
Logger.print("JudgeHideFostInput", "isShouldHideInput--------------->");
if (v != null && (v instanceof EditText)) {
int[] l = { 0, 0 };
v.getLocationInWindow(l);
int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
+ v.getWidth();
if (event.getRawY() > top && event.getRawY() < bottom ) {
// 点击EditText的事件,忽略它
return false;
} else {
return true;
}
}
return false;
}
最后,隐藏软键盘。
public static void hideSoftInput(Activity mActivity,IBinder token) {
Logger.print("JudgeHideFostInput", "hideSoftInput--------------->");
if (token != null) {
InputMethodManager im = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(token,
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
点击空白处隐藏软键盘这个功能我也是从网上借鉴而来,当时百度了很多方法,最后的最后就成了我现在用得这个。借鉴的那个大神的,哪部分借鉴的已经不记得了。现将我的思路和我的最终实现方式分享出来,希望对大家有所帮助。