Android 键盘收起

最近项目上遇一个键盘问题:
在一个Activity上显示了一个带EditText的Dialog,在Dialog的OnDismissListener调用了键盘的hideSoftInputFromWindow()方法,但键盘并没有隐藏,还返回了false。

这个方法有两个参数,下面是我传入的值。

if (getWindow().getCurrentFocus() != null) {
  imm().hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
} else {
  imm().hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}

原理都没有错,就是没有隐藏掉,不知道是为什么?

于是我就看了一下源码的注释

/**
     * Synonym for {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}
     * without a result: request to hide the soft input window from the
     * context of the window that is currently accepting input.
     *
     * @param windowToken The token of the window that is making the request,
     * as returned by {@link View#getWindowToken() View.getWindowToken()}.
     * @param flags Provides additional operating flags.  Currently may be
     * 0 or have the {@link #HIDE_IMPLICIT_ONLY} bit set.
     */
    public boolean hideSoftInputFromWindow(IBinder windowToken, int flags) {
        return hideSoftInputFromWindow(windowToken, flags, null);
    }

上面是hideSoftInputFromWindow()方法的官方解释。意思就是说,需要使用当前正在接收输入事件的Window来隐藏。

重点来了, 当前接收输入事件Window

这个指的是Dialog的Window还是Activity的Window?
经过我实验,都不是确定指的是哪一个,其实指的是获取焦点的那个Window。
当Dialog消失的时候,指的就是Activity的
当Dialog没有消失的时候,指的就是Dialog的。

所以有些解决办法

dialog.setOnDismissListener(()->{
    Au.postDelay(hideInput(), 100);
});

并不是一个可靠的方法,不知道100ms之后,dialog是不是真正从屏幕上消失了。

最后,解决办法:尽早隐藏键盘

.setPositiveButton(
      "dismiss",
      (dialog1, which) -> {
           hideInput();
           dialog1.dismiss();
      });

如果那位大神,有更好的办法,欢迎留言交流

你可能感兴趣的:(Android 键盘收起)