最近專案中,用到了橫屏。並且通過fragment做了tab頁效果。做ui的過程中ui展現沒有發現問題,但是今天上午,偶爾卻發現,當手機鎖屏時,我的fragment會銷毀掉,activity也會銷毀掉,並且fragment和activity會重啟。這個之前印象中,鎖屏只會onpause相違背。解決了一上午沒解決掉。坑娘啊~
首先,橫屏設定, 簡單在manifest檔案中通過activity標籤的 android:screenorientation="landscape"設定。
再來看看出現的問題,在logcat中列印的資訊。
2.問題來了,如果這個時候,按手機上的電源鍵,讓手機鎖屏,列印出來的生命週期方法很恐怖
可以看出,不是在onpause之後就停止了,而是銷毀,又重新建立了兩次fragment和activity。這個我就接受不了了,研究了一上午android手機鎖屏到底幹了些什麼東東。根骨太淺,木有研究明白。
3. 更恐怖的來了,當我們重新開啟之後,生命週期方法如下
activity和fragment再重新獲取焦點的時候,發現真個應用中多了好幾個fragment的物件。這是為什麼呢???????
首先上解決辦法:
在manifest檔案中,設定activity屬性 android:configchanges="orientation|screensize|keyboardhidden",當發生這些配置改變時不會重新oncreate。注意得有screensize
解決之後生命週期方法呼叫詳情:
1.第一次啟動獲取焦點
2.鎖屏
3.開屏
順眼多了~~
原因呢?從網上發現了如下資料:
==android 2.3以前的橫豎屏切換==
在android 2.3平台上,我們可以需要設定介面的橫豎屏顯示時,可以在androidmanifest.xml中,對activity的屬性新增以下**:
android:configchanges="orientation"
同時在activity中覆寫onconfigurationchanged方法
@override
public void onconfigurationchanged(configuration newconfig) {
super.onconfigurationchanged(newconfig);
log.i("tag","i'm android 2.3");
通過設定,當前activity在橫豎屏切換的時候,便不會重新走activity的生命週期,而是直接執行onconfigurationchanged()方法裡的內容。
==android 4.0以後的橫豎屏切換==
當我們在android 4.0上像之前那樣設定橫豎屏時,會發現竟然沒有效果,activity依然走自己的生命週期,這是因為在api level 13以後android做了修改了,sdk描述如下:
也就是說在android 3.2(api level 13)以後,當裝置橫豎屏切換時螢幕尺寸也改變了。因此,如果你想在api level 13或者更高的環境下,像以前那樣阻止裝置的橫豎屏切換,你需要在orientation後加上screensize。也就說你要像這樣宣告:android:configchanges="orientation|screensize"。
也就是說我們現在要在androidmanifest.xml中的activity加入以下屬性:
android:configchanges="orientation|screensize"
同時依然要在activity中覆寫onconfigurationchanged方法
@override
public void onconfigurationchanged(configuration newconfig) {
super.onconfigurationchanged(newconfig);
log.i("tag","i'm android 4.0");
Android之設定橫屏豎屏
方案一 在androidmanifest.xml中配置 在專案的androidmanifest.xml中找到你所指定的activity中加上android screenorientation屬性,它有以下幾個引數 unspecified 預設值 由系統來判斷顯示方向.判定的策略是和裝置相關的,所以不...
Android設定橫屏顯示
在開發 遊戲的時候,有些遊戲是只能橫屏玩的,所以手機豎立放置的時候,要保持遊戲畫面依然橫屏。遊戲開發之初最好就確定是用橫屏還是豎屏,如果容忍轉屏的話,不僅需要作兩種介面布局,而且橫豎屏切換很可能會記憶體溢位,導致程式崩潰。文 jackliao 要做到這個要求其實很簡單,在 android manif...
android 橫屏豎屏判斷
方法1 displaymetrics dm new displaymetrics getwindowmanager getdefaultdisplay getmetrics dm int width dm.widthpixels int height dm.heightpixels 方法2 if t...