1. 程式人生 > >android: 橫豎屏切換總結-佈局改變和資料儲存

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

         這種方法缺點是動態適應差。比如橫豎屏切換時需要你自己寫程式碼來使用不同的layout等resource,語言設定的動態改變等,不推薦.

首先要在配置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() 

Android橫豎屏切換時會觸發onSaveInstanceState,而還原時會產生onRestoreInstanceState。
注意  :
   *
我們不應該儲存那些依賴Activity的資料,比如Drawable,Adapter,View或者任何與Context相關聯的資料。因為上一個Activity已經沒有了,如果你還要保持這些資源的引用,可能導致資源洩露。

3.新載入,儲存之前資料不變onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()       

     需要在重新載入過程中儲存之前的操作內容或資料,則需要儲存之前的資料。然後在activity的 onCreate()中取出來。當然,如此就不能設定android:configChanges()了,否則就不會呼叫onCreate()方法。那麼 資料可以儲存在哪呢?Android中四種儲存方法都可以。  

還可以用Android為我們提供了onRetainNonConfigurationInstance()方法來暫時儲存資料。
     當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、設定Activityandroid:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次。

c、設定Activityandroid: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