最近做添加門店,門店昵稱自動根據文字變化去搜索后台數據,但是一搜索軟鍵盤就關閉了,感覺用戶體驗不太好。一開始根本不知道啥問題,找了半天才發現是網絡請求dialog加載導致軟件盤隱藏的,后面直接把dialog給注釋掉了。忙的做項目沒時間查資料。今天網上搜了一下,有其他解決辦法,通過人家貼的源碼才知道。不得感嘆一下:關鍵時刻還是源碼好使啊!
首先說下結論:
1.AlertDialog和ProgressDialog默認可以和系統軟鍵盤並存與同意屏幕(其實質是並存於同一個window窗口,具體下面會解釋)
2.Dialog以及用戶自定義的繼承自Dialog的彈出框默認不可以和軟鍵盤並存與同一屏幕
我遇到的就是第二種情況還是對底層不太熟悉,根本不知道啥問題,檢查代碼都沒問題,最后只能把dialog注釋掉不顯示,浪費好多時間,如果想dialog和軟件盤並存的話
2.1Dialog對象設置
Dialog di = new Dialog(MainActivity.this); di.setTitle("test test"); di.getWindow().setFlags( WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
2.2自定義繼承自Dialog對象的設置
public class LoadingDialog extends Dialog { ... } loadDialog = new LoadingDialog(this, R.style.dialog); loadDialog.getWindow().setFlags( WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
那么為什么會這樣,還是對本質不了解
Activity是什么?Dialog是什么?軟鍵盤的實質是什么?他們三個和Window窗口的關系是什么?
通過網上查看解釋源碼得知:
Acitvity的布局是添加在所創建的window窗口中的
dialog需要創建一個屬於自己的window窗口
然而軟鍵盤的實質就是一個自定義的Dialog
由於軟鍵盤也是一個自定義dialog,那么實質上就是我們的自定義dialog和軟鍵盤的並存關系了。
最終結論:由於dialog是依附於window窗口存在的,所以是由window的屬性控制dialog和軟鍵盤的顯示。
dialog中源碼注釋已經說明如果需要dialog顯示在軟鍵盤之上,就需要為window添加FLAG_ALT_FOCUSABLE_IM這個屬性。我們通過繼承Dialog自定義的彈出窗口也需要為他們所在的window設置這個屬性才可以和軟鍵盤並存。
by 郝金剛