Android橫屏下Fragment介面重疊問題

2021-09-08 19:22:39 字數 1777 閱讀 1206

前言:

專案是基於平板開發的,設計的介面是要求橫屏展示介面。所以我將所有的activity都強制設定為橫屏

android:screenorientation="

landscape

"

問題:主介面,最常見的activity+n個fragment 

我這裡使用的hide、show fragment的方式來切換fragment,當關閉手機、平板螢幕再開啟,會發現fragment介面重疊

1、先通過介面來了解具體情況

介面左側是4個tab按鈕,對應四個fragment介面,如下面兩個圖 ,是正常的介面顯示效果,這裡我已經將這個activity強制為橫屏顯示

2、正常情況下,我這個時候關閉了螢幕,然後在開啟螢幕,可以看到 這個時候會顯示 之前開啟過的fragment介面,導致介面重疊

此時,我們測試將activity橫屏顯示去掉,讓他豎屏顯示,然後在進行關螢幕,開啟螢幕操作,會發現 在豎屏的情況下,並沒有發生介面重疊的問題。

那麼我們就可以猜出問題所在了:生命週期

3、接著我們給activity的oncreate() onresume()方法 fragment的oncreateview() onresume()方法列印log

(1)看我們關閉螢幕的時候執行的生命方法

這裡我們可以看到,當我們關閉螢幕的時候,很顯然activity又執行了一遍生命週期

(2)在看我們開啟螢幕的時候執行的生命方法

可以看到,activity又執行了一次oncreate()方法,而fragment執行了多次oncreateview()

總結一下:鎖屏關閉螢幕後,activity會由橫屏切換為豎屏,這個時候執行了oncreate()方法,但是activity原來對應的fragment並沒有被銷毀,(導致第一張生命週期圖中 今日任務fragment執行了兩次onresume,因為新建了乙個和原來未被銷毀的乙個,此時存在兩個今日任務fragment), 解屏開啟螢幕後,activity又有豎屏切換為橫屏(我們強制設定的橫屏顯示),又執行了oncreate()方法,導致又建立了一次fragment,但是原來的fragment還是沒有被銷毀(所以第二章生命週期圖中,我們可以看到此時存在了3個今日任務fragement的onresume()方法)。那麼最終就會導致開啟螢幕後 之前所有未被銷毀的fragment都顯示出來。

解決方法:

我們不讓開關螢幕的時候activity走生命週期,那麼在清單檔案中給activity設定下面這兩個屬性即可

android:screenorientation="

landscape

"android:configchanges="

orientation|keyboardhidden|screensize

"

注意:4.0以上的configchanges需要新增screensize屬性

,否則切換橫豎屏仍會執行生命週期

android 橫屏豎屏判斷

方法1 displaymetrics dm new displaymetrics getwindowmanager getdefaultdisplay getmetrics dm int width dm.widthpixels int height dm.heightpixels 方法2 if t...

Android設定橫屏顯示

在開發 遊戲的時候,有些遊戲是只能橫屏玩的,所以手機豎立放置的時候,要保持遊戲畫面依然橫屏。遊戲開發之初最好就確定是用橫屏還是豎屏,如果容忍轉屏的話,不僅需要作兩種介面布局,而且橫豎屏切換很可能會記憶體溢位,導致程式崩潰。文 jackliao 要做到這個要求其實很簡單,在 android manif...

禁止Android 橫屏豎屏切換

在android中要讓乙個程式的介面始終保持乙個方向,不隨手機方向轉動而變化的辦法 只要在androidmanifest.xml裡面配置一下就可以了。在androidmanifest.xml的activity 需要禁止轉向的activity 配置中加入android screenorientatio...