我是真的想哭了,這個DialogFragment全屏的適配,我是真的不想再去碰了。
之前有寫過一篇http://www.itdecent.cn/p/8a55659cf47c
這里確實是能讓Dialog全屏,而且還是遮擋住狀態(tài)欄的全屏。但不適合所有情況,如果我只想讓寬或者高全屏,而不是整個都全屏,那就不太適合使用這種方法,只能去尋求其它的出路。我現(xiàn)在需要只讓高度全屏。
結(jié)果到現(xiàn)在已經(jīng)幾個月了,一直都沒辦法完全的適配,過段時間就xxx機型有問題,過段時間就xxx機型有問題。我的內(nèi)心是真的崩潰,所以說如果你想要使用Dialog來實現(xiàn)全屏的效果,還真的要三思后行,一般都不會用Dialog來做全屏的,但是半全屏還是有可能的。真的,Dialog不能碰,到處都是坑。
機型、版本、各種屏幕(全面屏)、加上邏輯操作上的(比如隱藏狀態(tài)欄的操作不同導致的效果也不同)等等,一種適配在另一個地方就會出問題,有種拆東墻補西墻的感覺,你解決完這一塊的適配,另外一塊之前已經(jīng)解決的又出問題。那每次我給一臺特殊的機型做適配的時候,還要把之前沒問題的都再檢查一遍。
一開始,想要實現(xiàn)全屏,網(wǎng)上大部分都是兩種說法,一種是在style中設(shè)置,另一種是使用setLayout方法
getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
好,你以為有這么簡單,于是有時候莫名其妙的頂部有一段間距。

然后我找到一個方法,把這段代碼寫到onStart()生命周期中就能解決這個。
但是你以為事情有這么簡單?當然要彈出軟鍵盤時,surprised ,DIalog的下半部分會閃一下。然后當時我想出的辦法是先在onStart()中設(shè)置,然后監(jiān)聽屏幕繪制,完成后獲取屏幕高度,再設(shè)死給dialog,這樣就能解決軟鍵盤彈出時一閃的問題。
但其實這種解決方法想想就覺得很蠢。
之后過一段時間,發(fā)現(xiàn)低版本的機型還是出了問題,就和上面一樣,狀態(tài)欄那里被截了一塊。
于是我找出了一種新的方法,給dialog的style設(shè)置-1,沒錯,當時我這樣做確實讓Dialog正常全屏了。
在自定義的dialogfragment的onCreate方法中加入
setStyle(DialogFragment.STYLE_NO_FRAME, -1);
但是生活處處是以外,前段時間,又出現(xiàn)一臺華為機淪陷了,還是距頂部有空白的問題(有狀態(tài)欄的情況正常,沒有狀態(tài)欄的時候就有空白)
于是我又找到了一個方法
getDialog().getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
刺激的是這臺機是沒問題了,但是換成有狀態(tài)欄的時候又出了問題。有狀態(tài)欄的時候,dialog會擋住狀態(tài)欄,但是狀態(tài)欄的字會穿透Dialog顯示在最上面。
此刻我笑了,笑得像一個孩子一樣開心,我是真的絕望。但是說明此時可以從給window設(shè)置flags入手不是嗎,但是flags有多少你們又不是不知道,雖然有說明,但是我感覺他們都差不多啊,比如





等等,描述我感覺都一樣啊,所以只能一個一個試了,最終在我的臥薪嘗膽下,我終于找到了一個合適的flag
Window window = getDialog().getWindow();
WindowManager.LayoutParams winParams = window.getAttributes();
winParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
沒錯,就是這個FLAG_LAYOUT_INSET_DECOR
既能在有狀態(tài)欄的情況下貼著狀態(tài)欄的下邊,又能在沒有狀態(tài)欄的情況下高度全屏顯示。
你以為事情就能這樣解決?
過了一段時間之后。。。。。。
低版本的紅米手機又出現(xiàn)間隔的問題了。。。。。。
什么?你問我怎么解決的?我已經(jīng)不想解決了。這個東西就特么是一個坑,最好的解決辦法就是把DialogFragment相關(guān)的代碼刪掉,這樣你就爽快了。
最后我用下面代碼能暫時解決所有機型的問題(但不能保證之后不會有問題)
Window window = getDialog().getWindow();
WindowManager.LayoutParams winParams = window.getAttributes();
winParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN;
但是用
getDialog().getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
不行,我感覺這兩個的設(shè)置方式是一樣的啊,沒想到還有差別