美文网首页Android开发
Dialog的软键盘显示和隐藏问题

Dialog的软键盘显示和隐藏问题

作者: 这里的山路十八弯 | 来源:发表于2017-11-07 17:46 被阅读49次

    AlertDialog中软键盘显示问题

    使用AlertDialog来自定义一个包含EditText的Dialog,你会发现使用的过程中软键盘不会自动显示出来,这个问题我觉得跟google对AlertDialog的定义有关,AlertDialog本身只是一个警示提示框,不需要编辑,只用来提示客户,客户需要做的操作只是取消和确定。
    所以这个问题的本身跟控件的定义有关,虽然网络上有各种解决的方法,我的建议还是把AlertDialog改成Dialog,问题自然就解决了。

    Dialog中软件盘隐藏问题

    在Dialog中弹出软件盘后,你会发现软键盘的隐藏存在各种问题,你需要自定义一个Dialog,并在自定义的Dialog中实现以下代码

    public class MyDialog extends Dialog {
        public MyDialog(@NonNull Context context) {
            super(context);
        }
    
        public MyDialog(@NonNull Context context, int themeResId) {
            super(context, themeResId);
        }
    
        protected MyDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
            super(context, cancelable, cancelListener);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                View v = getCurrentFocus();
                if (isShouldHideKeyboard(v, ev)) {
                    hideKeyboard(v.getWindowToken());
                }
            }
            return super.dispatchTouchEvent(ev);
        }
    
        /**
         * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
         *
         * @param v
         * @param event
         * @return
         */
        private boolean isShouldHideKeyboard(View v, MotionEvent event) {
            if (v != null && (v instanceof EditText)) {
                int[] l = {0, 0};
                v.getLocationInWindow(l);
                int left = l[0],
                        top = l[1],
                        bottom = top + v.getHeight(),
                        right = left + v.getWidth();
                if (event.getX() > left && event.getX() < right
                        && event.getY() > top && event.getY() < bottom) {
                    // 点击EditText的事件,忽略它。
                    return false;
                } else {
                    return true;
                }
            }
            // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
            return false;
        }
    
        private void hideKeyboard(IBinder token) {
            if (token != null) {
                InputMethodManager im = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
    }
    

    这时候你会发现问题解决了。。。如果还没有解决,请在留言告诉我。

    相关文章

      网友评论

        本文标题:Dialog的软键盘显示和隐藏问题

        本文链接:https://www.haomeiwen.com/subject/lzvjmxtx.html