android: 橫豎屏切換總結-佈局改變和資料儲存
引言
一、佈局問題
二、重新載入問題
三、Q:橫豎屏生命週期的切換有可能是什麼樣的?
引言
Activity在Configuration變化(比如裝置橫豎屏切換)時會重啟Activity,即會執行onDestory()周期函式,然後onCreate(),重新建立Activity。這是因為這樣可以讓Activity動態適應Configuration,比如橫屏時使用橫屏的layout,drawable等resources,豎屏時使用豎屏的layout,drawable等resources。
(BTW,徹底禁止翻轉,可以設定android:screenOrientation的屬性為nosensor)
重啟Activity可能導致佈局長寬不合適,也可能導致大量資料的重新獲取,網路連線的重新建立等問題,使用者體驗非常差。所以應該在Activity銷燬前儲存當前活動的狀態,在Activity再次Create的時候載入配置。
所以,Android橫豎屏切換要解決的問題就兩個:一、佈局問題;二、重新載入問題。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、佈局問題
1.禁止切換橫屏或豎屏
可以在配置Activity的地方進行如下的配置
android:screenOrientation="portrait"
android:screenOrientation="landscape"
或者 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
這樣就可以保證是豎屏總是豎屏了,或者橫屏總是橫屏。
2.可以切換橫屏或豎屏
若要軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的佈局。可以通過以下方法來切換佈局:
1)layout-land和layout-port
在res目錄下建立layout-land(橫屏的layout)和layout-port(豎屏的layout)目錄,相應的layout檔案不變,比如main.xml。其他的不用管,模擬器會自動尋找。
2)onCreate()中判斷橫豎屏
通過this.getResources().getConfiguration().orientation判斷當前是橫屏還是豎屏,然後載入相應的xml佈局檔案。因為當螢幕變為橫屏的時候,系統會重新呼叫當前Activity的OnCreate方法,你可以把以下方法放在你的 OnCreate中來檢查當前的方向,然後可以讓你的SetContentView來載入不同的Layout xml.
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.i("info", "landscape");
}
else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Log.i("info", "portrait");
}
3)橫豎屏切換用onConfigurationChanged
首先要在配置Activity的時候進行如下的配置:
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
另外需要重寫Activity的onConfigurationChanged方法。實現方式如下,不需要做太多的內容:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
....
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
.....
}
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、重新載入問題
1.不需要重新載入
在androidmanifest.xml中加入配置android:configChanges="orientation|keyboardHidden"
橫豎屏切換時呼叫onConfigurationChanged(Configuration newConfig)
注意:當橫屏變豎屏的時候,他會呼叫兩次onConfigurationChanged,而豎屏轉橫屏時他只調用一次。
2.重新載入,儲存之前資料不變onSaveInstanceState()和onRestoreInstanceState()
注意 :
*我們不應該儲存那些依賴Activity的資料,比如Drawable,Adapter,View或者任何與Context相關聯的資料。因為上一個Activity已經沒有了,如果你還要保持這些資源的引用,可能導致資源洩露。
3.重新載入,儲存之前資料不變onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()
需要在重新載入過程中儲存之前的操作內容或資料,則需要儲存之前的資料。然後在activity的 onCreate()中取出來。當然,如此就不能設定android:configChanges()了,否則就不會呼叫onCreate()方法。那麼 資料可以儲存在哪呢?Android中四種儲存方法都可以。
當Device configuration發生改變時,將伴隨Destroying被系統呼叫。通過這個方法可以像onSaveInstanceState()的方法一樣保留變化前的Activity State,最大的不同在於這個方法可以返回一個包含有狀態資訊的Object,其中甚至可以包含Activity Instance本身。新建立的Activity可以繼承大量來至於Parent Activity State資訊。
onRetainNonConfigurationInstance這個方法最大的好處是:
* 當Activity曾經通過某個資源得到一些圖片或者資訊,那麼當再次恢復後,無需重新通過原始資源地址獲取,可以快速的載入整個Activity狀態資訊。
* 當Activity包含有許多執行緒時,在變化後依然可以持有原有執行緒,無需通過重新建立程序恢復原有狀態。
* 當Activity包含某些Connection Instance時,同樣可以在整個變化過程中保持連線狀態。
注意:
* 我們不應該儲存那些依賴Activity的資料,比如Drawable,Adapter,View或者任何與Context相關聯的資料。因為上一個Activity已經沒有了,如果你還要保持這些資源的引用,可能導致資源洩露。
* onRetainNonConfigurationInstance()在onSaveInstanceState()之後被呼叫。
* 呼叫順序同樣介於onStop() 和 onDestroy()之間。
使用方法如下:
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
在onCreate()中呼叫getLastNonConfigurationInstance(),獲取onRetainNonConfigurationInstance()儲存的資料。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {
data = loadMyData();
}
...
}
Q:橫豎屏生命週期的切換有可能是什麼樣的?
a、不設定Activity的:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
如下:啟動一個Activity,
onCreate()
onStart()
onResume()
豎屏切換到橫屏:(呼叫一次生命週期)
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
橫屏切換到豎屏:(呼叫兩次生命週期)
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
b、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次。
c、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法。
參考:
http://developer.android.com/guide/topics/resources/runtime-changes.html
http://chengbs.iteye.com/blog/1156167
http://java-admin.iteye.com/blog/730863
相關推薦
android: 橫豎屏切換總結-佈局改變和資料儲存
目錄:引言一、佈局問題 二、重新載入問題 三、Q:橫豎屏生命週期的切換有可能是什麼樣的? 引言 Activity在Configuration變化(比如裝置橫豎屏切換)時會重啟Activity,即會執行onDestory()周期函式,然後onCreate(),重新建立Activity。這是因
Android橫豎屏切換總結
Android橫豎屏要解決的問題應該就兩個:一.佈局問題二.重新載入問題1.佈局問題:如果不想讓軟體在橫豎屏之間切換,最簡單的辦法就是在專案的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation屬性,他有
Android橫豎屏切換總結(Android資料收藏)
Android橫豎屏切換總結(Android資料) Android橫豎屏要解決的問題應該就兩個: 一.佈局問題 二.重新載入問題 1.佈局問題:如果不想讓軟體在橫豎屏之間切換,最簡單的辦法就是在專案的AndroidManifest.xml中找到你所指定的activi
Android 橫豎屏切換載入不同的佈局
1.禁止APP內橫豎屏切換 在 配 置 Activity 的 地 方 進 行 如 下 的 配 置 android:screenOrientation="portrait"(landscape 是橫向,portrait 是縱向)。這樣就可以保證是豎屏總是豎屏 andr
Android 橫豎屏切換載入不同的佈局
橫屏豎屏在配置檔案中的設定,之前已經說過。那麼現在主要是說,切換之後由於螢幕寬高尺寸的改變,因此需要重新設定一個佈局檔案以適應現在的新的尺寸。 預設狀態下,Activity每次橫豎屏切換(包括用setRequestedOrientation呼叫)都會重新呼叫一輪onPaus
Android應用:橫豎屏切換總結
眨眼間,已經到了2016你年春節前,離上一篇部落格的時間已經有6個月多,回想起這半年的種種,不得不說,學習和工作實在是太忙了,或許這就是程式設計師的真實寫照吧。 寫部落格之初,主要的目的還是為了把自己的學習痕跡記錄下來,寫的東西比較基礎,也不
Android 橫豎屏切換時 Custom Dialog 佈局自適應
@Override public void onContentChanged() { super.onContentChanged(); Display display = mActivity.getWindowManager WindowMan
Android橫豎屏切換, 手機鎖屏以及按Home鍵和返回鍵時的Activity的生命週期
用手機做了實驗,結果如下: 豎屏切橫屏會呼叫完整的生命週期: 03-09 17:08:35.170: I/MainActivity(14086): MainActivity Paused 03-09 17:08:35.200: I/MainActivity(14086):
Android橫豎屏切換View設置不同尺寸或等比例縮放的XML解決方案
fill 文件結構 nts mas hang 同名 log lan spa 在一些應用中,涉及到橫豎屏切換,View要切換成不同大小比例尺寸。為解決這種開發場景,有多種解決方案,比如可以重寫View,實現橫豎切換在onMesure或者此類View的回調方法裏面重新測量重新繪
android 橫豎屏切換不重走生命周期
orien man ati nta 系統 生命周期 oar hang andro android在系統配置發生改變時,Activity會被重新創建,但是某些情況下我們希望系統配置改變時不會重新創建Activity,這個時候我們可以給Activity指定相對應的configC
(摘轉)Android橫豎屏切換小結
實際的專案從activity-a跳轉到B,在b的oncreate中設定 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);在b finish()之後回到act
android 橫豎屏切換的生命週期
如下設定,當橫豎屏切換時,activity的狀態是不會改變的 在manifest中設定該Activity的configChanges為android:configChanges="screenSize|keyboardHidden|orientation" 總結如下:
Android橫豎屏切換你必須知道的事
平常我們遇到的橫豎屏切換最大的問題就是,螢幕切換後,原來介面中的東西會被清空,也就是Activity被重新建立。那麼這時候就需要你做一些設定了,最簡單的就是在AndroidMainfest.xml中設定activity中的android:screenOrient
android橫豎屏切換,activity生命週期方法是否會回撥
預設情況下的一個應用,沒有在androidmainfest檔案進行任何設定一切都是預設的情況下,我們當改變了他的orientation時候是會銷燬當前activity,新建一個新的activity public void orien(View view)
【RecyclerView】Android 橫豎屏切換 超便捷解決方案
相信Android 開發者大多數都遇到過橫豎屏切換的需求,往往最後選擇了鎖定豎屏,或者鎖定橫屏的體驗。或者每次切換螢幕就要切換顯示資料的控制元件。谷歌官方推出的RecyclerView控制元件讓你不再有這樣的煩惱。 最近這兩天又不是很忙了,閒下來看了些關於5.
懸浮的view在橫豎屏切換時如何改變大小?
1.通過註冊G-sensor獲得旋轉資料。但是G-sensor傳上來的資料會快於Activity和view改變的時間。2.Activity和view都能獲得橫豎屏切換的訊息,在onConfigurationChanged方法中處理。一般懸浮的view跟Activity無法關
Android 橫豎屏切換 導致崩潰
在不少應用中都會發生出現螢幕方向改變,但是在改變的時候又會發生什麼事情呢? 我們寫一個app測試一下 我們在mainActivity中寫了android生命週期中幾個重要的階段onCreate,onResume,onStart,onDestory,onS
Android橫豎屏切換小結
Android開發中,大多APP可能根據實際情況直接將APP的介面方向設死了,或豎屏或橫屏。但是,我們還是會遇到橫豎屏切換的功能需求,不管是通過物理重力感應觸發,還是使用者手動觸發。所以,我們有必要去弄清楚Android中橫豎屏切換到底做了什麼。
原始碼DisplaySettings分析android橫豎屏切換的開關
由於jwisp本人在使用手機過程中, 經常需要開啟或者關閉橫豎屏的開關. (比如jwisp在發簡訊或者各種文字編輯情況時, 經常需要全鍵盤來快速輸入, 而瀏覽文字或者某些應用時, 躺著或者坐著不切換橫豎屏) 好, 有了jwisp這個需求, 我們如何實現呢. 這裡說兩句廢話, 有同學一碰到問題先網上搜, 其實
Android 橫豎屏切換 引起的1s左右黑屏
從一個豎屏Activity,跳轉到一個橫屏Activity,在橫屏頁面返回,遇到了1s左右的黑屏.產生黑屏的原因是豎屏Activity重新走oncreate()--onresume()生命週期,在此期間會有黑屏. 解決方案:在AndroidManifest中該Activit