最近项目上遇一个键盘问题:
在一个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();
});
如果那位大神,有更好的办法,欢迎留言交流
网友评论