您的位置:首页 > 其它

复杂布局中点击编辑框EditText以外界面无法隐藏软键盘的解决方法

2015-09-10 16:58 429 查看
前面我写了一篇文章,题目为”如何将编辑框EditText置于系统软键盘之上及相关细节的实现“,并且在代码中介绍了使用复写onTouchEvent(MotionEvent event)方法来实现点击编辑框EditText以外界面无法隐藏软键盘的解决方法,但事实上,该方法并不总是有效,特别是在复杂的布局中往往会失效,因此特给大家分享一个比较给力的方法,那就是添加如下代码:

<pre name="code" class="java"> @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;  
    }




这里有一点细节值得注意,如果你的输入框所在布局里面除了EditText外,还有其它东西。比如你的发送按钮跟编辑框同在一个布局并且在编辑框的右边,大家都知道,我们都希望在编辑框什么都不输入时点击发送按钮提示消息为空,要求用户再次输入,而不是点完按钮就直接隐藏软键盘,这显然不符合。因此上面的isShouldHideInput方法要稍微作下调整,如下:

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();
            //event.getX() > left && event.getX() < right 
            if (event.getY() > top && event.getY() < bottom) {  
                // 点击的是输入框区域,保留点击EditText的事件  
                return false;  
            } else {  
                return true;  
            }  
        }  
        return false;  
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: