您的位置:首页 - 教程 - 安卓 - 正文
Android点击其他任意位置收起软键盘

  在Android应用开发中,经常出现这样的需求,用户在输入文字的过程中,可能不想继续输入了,通过滑动或者点击其他位置(除软键盘和EditText以外的任何位置),希望能够自动收回键盘,这个功能可能有些rom会自己实现了,但是大部分还是没有自己实现这个功能的,那么如果我们要自己实现,要如何解决呢?

  首先,我们当然要先拦截其他任何的用户触摸屏幕的事件,通过重写Activity的boolean dispatchTouchEvent(MotionEvent ev);可是实现拦截用户的触摸事件。代码如下:

     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         DisplayUtils.hideInputWhenTouchOtherView(this, ev, getExcludeTouchHideInputViews());
         return super.dispatchTouchEvent(ev);
     }

DisplayUtils.hideInputWhenTouchOtherView方法就是我们自己实现的当必要时候隐藏软键盘的代码了。关于hideInputWhenTouchOtherView的方法实现如下:

    /**
      * 当点击其他View时隐藏软键盘
      * @param activity
      * @param ev
      * @param excludeViews  点击这些View不会触发隐藏软键盘动作
      */
     public static final void hideInputWhenTouchOtherView(Activity activity, MotionEvent ev, List<View> excludeViews){
 
 
         if (ev.getAction() == MotionEvent.ACTION_DOWN){
             if (excludeViews != null && !excludeViews.isEmpty()){
                 for (int i = 0; i < excludeViews.size(); i++){
                     if (isTouchView(excludeViews.get(i), ev)){
                         return;
                     }
                 }
             }
             View v = activity.getCurrentFocus();
             if (DisplayUtils.isShouldHideInput(v, ev)){
                 InputMethodManager inputMethodManager = (InputMethodManager)
                         activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                 if (inputMethodManager != null){
                     inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
                 }
             }
 
         }
     }

方法参数中的excludeViews表示点击这么View不会去试图隐藏软键盘,因为有些View的触摸事件我们有时候并不希望去隐藏软键盘,比如EditText的背景布局,聊天输入框的发送按钮等(如果摸一下发送按钮,键盘就收回去了岂不是很蛋疼)

  可以看到,整个方法方法的实现过程就是通过判断触摸位置是属于哪个View,如果是需要排除的View,就直接不处理了.如果判断出来是点击了其他任意非EditText的View,就会隐藏软键盘。其他两个判断函数如下:

     public static final boolean isTouchView(View view, MotionEvent event){
         if (view == null || event == null){
             return false;
         }
         int[] leftTop = {0, 0};
         view.getLocationInWindow(leftTop);
         int left = leftTop[0];
         int top = leftTop[1];
         int bottom = top + view.getHeight();
         int right = left + view.getWidth();
         if (event.getRawX() > left && event.getRawX() < right
                 && event.getRawY() > top && event.getRawY() < bottom){
             return true;
         }
         return false;
     }
 
     public static final boolean isShouldHideInput(View v, MotionEvent event){
         if (v != null && (v instanceof EditText)){
             return !isTouchView(v, event);
         }
         return false;
     }

  通过复用hideInputWhenTouchOtherView() 方法(甚至你可以在基类Activity里实现)就可以在任何Activity中以最少代码实现点击其他任意位置收起软键盘的功能了。如果代码有什么需要指正或者有更好的替代方案的,请大家及时告知哈。


评论:
  • 2017-04-21 12:49