最近項目上遇一個鍵盤問題:
在一個Activity上顯示了一個帶EditText的Dialog,在Dialog的OnDismissListener調(diào)用了鍵盤的hideSoftInputFromWindow()方法谴忧,但鍵盤并沒有隱藏朴下,還返回了false努咐。
這個方法有兩個參數(shù),下面是我傳入的值殴胧。
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?
經(jīng)過我實驗碗誉,都不是確定指的是哪一個召嘶,其實指的是獲取焦點的那個Window。
當Dialog消失的時候哮缺,指的就是Activity的
當Dialog沒有消失的時候弄跌,指的就是Dialog的。
所以有些解決辦法
dialog.setOnDismissListener(()->{
Au.postDelay(hideInput(), 100);
});
并不是一個可靠的方法蝴蜓,不知道100ms之后碟绑,dialog是不是真正從屏幕上消失了俺猿。
最后茎匠,解決辦法:盡早隱藏鍵盤
.setPositiveButton(
"dismiss",
(dialog1, which) -> {
hideInput();
dialog1.dismiss();
});
如果那位大神,有更好的辦法押袍,歡迎留言交流