前言:html
項目是基於平板開發的,設計的界面是要求橫屏展現界面。因此我將全部的Activity都強制設置爲橫屏android
android:screenOrientation="landscape"
-----------------------------------------------------------------------------------------------------ide
問題:測試
主界面,最多見的Activity+n個Fragment spa
我這裏使用的hide、show Fragment的方式來切換Fragment,當關閉手機、平板屏幕再打開,會發現Fragment界面重疊設計
安卓開發_慕課網_Fragment實現Tab(App主界面)3d
-----------------------------------------------------------------------------------------------------code
一、先經過界面來了解具體狀況htm
界面左側是4個Tab按鈕,對應四個Fragment界面,以下面兩個圖 ,是正常的界面顯示效果,這裏我已經將這個Activity強制爲橫屏顯示blog
二、正常狀況下,我這個時候關閉了屏幕,而後在打開屏幕,能夠看到 這個時候會顯示 以前打開過的Fragment界面,致使界面重疊
此時,咱們測試將activity橫屏顯示去掉,讓他豎屏顯示,而後在進行關屏幕,打開屏幕操做,會發現 在豎屏的狀況下,並無發生界面重疊的問題。
那麼咱們就能夠猜出問題所在了:生命週期
三、接着咱們給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屬性,不然切換橫豎屏仍會執行生命週期