舒心、快乐,比什么都重要

如何解决EditText使用时,点击外侧系统键盘不消失的bug

在使用viewPager和EditText一起使用的时候,突然出现了一个bug,在点击EditText(此EditText是在ViewPager的Fragment中)

我在切换ViewPager的时候,如果你先点击了EditText系统键盘此时出现了,切换的时候系统键盘会在另一个Pager的页面继续存在

这样就非常难受了,而且点击空白或者系统键盘外侧系统键盘竟然不消失!

查了下需要在Activity中重写一些方法,重写dispatchTouchEvent拦截点击,判断是不是在点击系统的键盘区域,如果是就不让系统键盘消失,如果不是就让系统键盘消失

/**
     * 通过dispatchTouchEvent每次ACTION_DOWN事件中动态判断非EditText本身区域的点击事件,然后在事件中进行屏蔽系统键盘。
     * @param ev
     * @return
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                  View v = getCurrentFocus();
                  if (isShouldHideInput(v, ev)) {

                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                            if (imm != null) {
                                   imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                               }
                        }
                    return super.dispatchTouchEvent(ev);
                }
            // 必不可少,否则所有的组件都不会有TouchEvent了
            if (getWindow().superDispatchTouchEvent(ev)) {
                    return true;
                }
            return onTouchEvent(ev);
        }

    public  boolean isShouldHideInput(View v, MotionEvent event) {
            if (v != null && (v instanceof EditText)) {
                 int[] leftTop = { 0, 0 };
                    //获取输入框当前的location位置
                v.getLocationInWindow(leftTop);
                    int left = leftTop[0];
                    int top = leftTop[1];
                 int bottom = top + v.getHeight();
                   int right = left + v.getWidth();
                   if (event.getX() > left && event.getX() < right
                            && event.getY() > top && event.getY() < bottom) {
                            // 点击的是输入框区域,保留点击EditText的事件
                           return false;
                        } else {
                            return true;
                        }
                }
           return false;
        }

i forget where i found this code,but always thanks the author,even though he can,t see this  

posted @ 2016-10-26 13:03  Arcturis  阅读(596)  评论(0编辑  收藏  举报