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

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的软键盘显示和隐藏问题)