Dialog和軟鍵盤在屏幕上的並存問題:


  最近做添加門店,門店昵稱自動根據文字變化去搜索后台數據,但是一搜索軟鍵盤就關閉了,感覺用戶體驗不太好。一開始根本不知道啥問題,找了半天才發現是網絡請求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 郝金剛


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM