Android点击其他任意位置收起软键盘
Posted 厌世夕阳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android点击其他任意位置收起软键盘相关的知识,希望对你有一定的参考价值。
在android应用开发中,经常出现这样的需求,用户在输入文字的过程中,可能不想继续输入了,通过滑动或者点击其他位置(除软键盘和EditText以外的任何位置),希望能够自动收回键盘,这个功能可能有些rom会自己实现了,但是大部分还是没有自己实现这个功能的,那么如果我们要自己实现,要如何解决呢?
首先,我们当然要先拦截其他任何的用户触摸屏幕的事件,通过重写Activity的boolean dispatchTouchEvent(MotionEvent ev);可是实现拦截用户的触摸事件。代码如下:
1 @Override 2 public boolean dispatchTouchEvent(MotionEvent ev) { 3 DisplayUtils.hideInputWhenTouchOtherView(this, ev, getExcludeTouchHideInputViews()); 4 return super.dispatchTouchEvent(ev); 5 }
DisplayUtils.hideInputWhenTouchOtherView方法就是我们自己实现的当必要时候隐藏软键盘的代码了。关于hideInputWhenTouchOtherView的方法实现如下:
1 /** 2 * 当点击其他View时隐藏软键盘 3 * @param activity 4 * @param ev 5 * @param excludeViews 点击这些View不会触发隐藏软键盘动作 6 */ 7 public static final void hideInputWhenTouchOtherView(Activity activity, MotionEvent ev, List<View> excludeViews){ 8 9 10 if (ev.getAction() == MotionEvent.ACTION_DOWN){ 11 if (excludeViews != null && !excludeViews.isEmpty()){ 12 for (int i = 0; i < excludeViews.size(); i++){ 13 if (isTouchView(excludeViews.get(i), ev)){ 14 return; 15 } 16 } 17 } 18 View v = activity.getCurrentFocus(); 19 if (DisplayUtils.isShouldHideInput(v, ev)){ 20 InputMethodManager inputMethodManager = (InputMethodManager) 21 activity.getSystemService(Context.INPUT_METHOD_SERVICE); 22 if (inputMethodManager != null){ 23 inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0); 24 } 25 } 26 27 } 28 }
方法参数中的excludeViews表示点击这么View不会去试图隐藏软键盘,因为有些View的触摸事件我们有时候并不希望去隐藏软键盘,比如EditText的背景布局,聊天输入框的发送按钮等(如果摸一下发送按钮,键盘就收回去了岂不是很蛋疼)
可以看到,整个方法方法的实现过程就是通过判断触摸位置是属于哪个View,如果是需要排除的View,就直接不处理了.如果判断出来是点击了其他任意非EditText的View,就会隐藏软键盘。其他两个判断函数如下:
1 public static final boolean isTouchView(View view, MotionEvent event){ 2 if (view == null || event == null){ 3 return false; 4 } 5 int[] leftTop = {0, 0}; 6 view.getLocationInWindow(leftTop); 7 int left = leftTop[0]; 8 int top = leftTop[1]; 9 int bottom = top + view.getHeight(); 10 int right = left + view.getWidth(); 11 if (event.getRawX() > left && event.getRawX() < right 12 && event.getRawY() > top && event.getRawY() < bottom){ 13 return true; 14 } 15 return false; 16 } 17 18 public static final boolean isShouldHideInput(View v, MotionEvent event){ 19 if (v != null && (v instanceof EditText)){ 20 return !isTouchView(v, event); 21 } 22 return false; 23 }
通过复用hideInputWhenTouchOtherView() 方法(甚至你可以在基类Activity里实现)就可以在任何Activity中以最少代码实现点击其他任意位置收起软键盘的功能了。如果代码有什么需要指正或者有更好的替代方案的,请大家及时告知哈。
以上是关于Android点击其他任意位置收起软键盘的主要内容,如果未能解决你的问题,请参考以下文章