Dialog全屏適配問(wèn)題,你讓我流淚

我是真的想哭了,這個(gè)DialogFragment全屏的適配,我是真的不想再去碰了。
之前有寫(xiě)過(guò)一篇http://m.itdecent.cn/p/8a55659cf47c
這里確實(shí)是能讓Dialog全屏,而且還是遮擋住狀態(tài)欄的全屏。但不適合所有情況,如果我只想讓寬或者高全屏,而不是整個(gè)都全屏,那就不太適合使用這種方法,只能去尋求其它的出路。我現(xiàn)在需要只讓高度全屏。

結(jié)果到現(xiàn)在已經(jīng)幾個(gè)月了,一直都沒(méi)辦法完全的適配,過(guò)段時(shí)間就xxx機(jī)型有問(wèn)題,過(guò)段時(shí)間就xxx機(jī)型有問(wèn)題。我的內(nèi)心是真的崩潰,所以說(shuō)如果你想要使用Dialog來(lái)實(shí)現(xiàn)全屏的效果,還真的要三思后行,一般都不會(huì)用Dialog來(lái)做全屏的,但是半全屏還是有可能的。真的,Dialog不能碰,到處都是坑。

機(jī)型、版本、各種屏幕(全面屏)、加上邏輯操作上的(比如隱藏狀態(tài)欄的操作不同導(dǎo)致的效果也不同)等等,一種適配在另一個(gè)地方就會(huì)出問(wèn)題,有種拆東墻補(bǔ)西墻的感覺(jué),你解決完這一塊的適配,另外一塊之前已經(jīng)解決的又出問(wèn)題。那每次我給一臺(tái)特殊的機(jī)型做適配的時(shí)候,還要把之前沒(méi)問(wèn)題的都再檢查一遍。

一開(kāi)始,想要實(shí)現(xiàn)全屏,網(wǎng)上大部分都是兩種說(shuō)法,一種是在style中設(shè)置,另一種是使用setLayout方法

getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

好,你以為有這么簡(jiǎn)單,于是有時(shí)候莫名其妙的頂部有一段間距。


然后我找到一個(gè)方法,把這段代碼寫(xiě)到onStart()生命周期中就能解決這個(gè)。

但是你以為事情有這么簡(jiǎn)單?當(dāng)然要彈出軟鍵盤時(shí),surprised ,DIalog的下半部分會(huì)閃一下。然后當(dāng)時(shí)我想出的辦法是先在onStart()中設(shè)置,然后監(jiān)聽(tīng)屏幕繪制,完成后獲取屏幕高度,再設(shè)死給dialog,這樣就能解決軟鍵盤彈出時(shí)一閃的問(wèn)題。
但其實(shí)這種解決方法想想就覺(jué)得很蠢。

之后過(guò)一段時(shí)間,發(fā)現(xiàn)低版本的機(jī)型還是出了問(wèn)題,就和上面一樣,狀態(tài)欄那里被截了一塊。

于是我找出了一種新的方法,給dialog的style設(shè)置-1,沒(méi)錯(cuò),當(dāng)時(shí)我這樣做確實(shí)讓Dialog正常全屏了。
在自定義的dialogfragment的onCreate方法中加入

setStyle(DialogFragment.STYLE_NO_FRAME, -1);

但是生活處處是以外,前段時(shí)間,又出現(xiàn)一臺(tái)華為機(jī)淪陷了,還是距頂部有空白的問(wèn)題(有狀態(tài)欄的情況正常,沒(méi)有狀態(tài)欄的時(shí)候就有空白)

于是我又找到了一個(gè)方法

            getDialog().getWindow().setFlags(
                   WindowManager.LayoutParams.FLAG_FULLSCREEN,
                   WindowManager.LayoutParams.FLAG_FULLSCREEN);

刺激的是這臺(tái)機(jī)是沒(méi)問(wèn)題了,但是換成有狀態(tài)欄的時(shí)候又出了問(wèn)題。有狀態(tài)欄的時(shí)候,dialog會(huì)擋住狀態(tài)欄,但是狀態(tài)欄的字會(huì)穿透Dialog顯示在最上面。

此刻我笑了,笑得像一個(gè)孩子一樣開(kāi)心,我是真的絕望。但是說(shuō)明此時(shí)可以從給window設(shè)置flags入手不是嗎,但是flags有多少你們又不是不知道,雖然有說(shuō)明,但是我感覺(jué)他們都差不多啊,比如






等等,描述我感覺(jué)都一樣啊,所以只能一個(gè)一個(gè)試了,最終在我的臥薪嘗膽下,我終于找到了一個(gè)合適的flag

Window window = getDialog().getWindow();
WindowManager.LayoutParams winParams = window.getAttributes();
winParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;

沒(méi)錯(cuò),就是這個(gè)FLAG_LAYOUT_INSET_DECOR
既能在有狀態(tài)欄的情況下貼著狀態(tài)欄的下邊,又能在沒(méi)有狀態(tài)欄的情況下高度全屏顯示。

你以為事情就能這樣解決?
過(guò)了一段時(shí)間之后。。。。。。

低版本的紅米手機(jī)又出現(xiàn)間隔的問(wèn)題了。。。。。。

什么?你問(wèn)我怎么解決的?我已經(jīng)不想解決了。這個(gè)東西就特么是一個(gè)坑,最好的解決辦法就是把DialogFragment相關(guān)的代碼刪掉,這樣你就爽快了。

最后我用下面代碼能暫時(shí)解決所有機(jī)型的問(wèn)題(但不能保證之后不會(huì)有問(wè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);

不行,我感覺(jué)這兩個(gè)的設(shè)置方式是一樣的啊,沒(méi)想到還有差別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容