標籤:
前言:
項目是基於平板開發的,設計的介面是要求橫屏展示介面。所以我將所有的Activity都強制設定為橫屏
android:screenOrientation="landscape"
-----------------------------------------------------------------------------------------------------
問題:
主介面,最常見的Activity+n個Fragment
我這裡使用的hide、show Fragment的方式來切換Fragment,當關閉手機、平板螢幕再開啟,會發現Fragment介面重疊
安卓開發_慕課網_Fragment實現Tab(App主介面)
-----------------------------------------------------------------------------------------------------
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橫屏下Fragment介面重疊問題