前言: 項目是基於平板開發的,設計的界面是要求橫屏展示界面。所以我將所有的Activity都強制設置為橫屏 問題: 主界面,最常見的Activity+n個Fragment 我這裡使用的hide、show Fragment的方式來切換Fragment,當關閉手機、平板屏幕再打開,會發現Fragment ...
前言:
項目是基於平板開發的,設計的界面是要求橫屏展示界面。所以我將所有的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屬性,否則切換橫豎屏仍會執行生命周期