厌世夕阳

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  19 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

  在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中以最少代码实现点击其他任意位置收起软键盘的功能了。如果代码有什么需要指正或者有更好的替代方案的,请大家及时告知哈。

posted on 2016-03-07 13:06  厌世夕阳  阅读(4331)  评论(0编辑  收藏