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

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





等等,描述我感覺都一樣啊,所以只能一個一個試了,最終在我的臥薪嚐膽下,我終於找到了一個合適的flag
Window window = getDialog().getWindow(); WindowManager.LayoutParams winParams = window.getAttributes(); winParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
沒錯,就是這個FLAG_LAYOUT_INSET_DECOR
既能在有狀態列的情況下貼著狀態列的下邊,又能在沒有狀態列的情況下高度全屏顯示。
你以為事情就能這樣解決?
過了一段時間之後。。。。。。
低版本的紅米手機又出現間隔的問題了。。。。。。
什麼?你問我怎麼解決的?我已經不想解決了。這個東西就特麼是一個坑,最好的解決辦法就是把DialogFragment相關的程式碼刪掉,這樣你就爽快了。