1. 程式人生 > >Android 橫豎屏切換載入不同的佈局

Android 橫豎屏切換載入不同的佈局

1.禁止APP內橫豎屏切換

在 配 置 Activity 的 地 方 進 行 如 下 的 配 置

  • android:screenOrientation="portrait"(landscape 是橫向,portrait 是縱向)。這樣就可以保證是豎屏總是豎屏
  • android:screenOrientation="landscape"(landscape 是橫向,portrait 是縱向)。這樣就可以保證是橫屏總是橫屏

上述修改也可以在Java程式碼中通過類似如下程式碼來設定

  • setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

2.重啟Activity的橫豎屏切換的處理

預設狀態下,Activity每次橫豎屏切換(包括用setRequestedOrientation呼叫)都會重新呼叫一輪onPause-> onStop-> onDestory-> onCreate->onStart->onResume操作,從而銷燬原來的Activity物件,建立新的Activity物件,這是因為通常情況下軟體在橫豎屏之間切換,介面的高寬會發生轉換,從而可能會要求不同的佈局。

  1. 在res目錄下建立layout-land和layout-port目錄,相應的layout檔名不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程式自己會呼叫Activity的onCreate方法,從而根據當前橫豎屏情況自動載入響應的佈局。
  2. 假如佈局資源是不一樣又不按照如上設定,則需要通過java程式碼來判斷當前是橫屏還是豎屏然後來載入相應的xml佈局檔案(比如mainP為豎屏mainL為橫屏)。因為當螢幕變為橫屏的時候,系統會重新呼叫當前Activity的onCreate方法,你可以把以下方法放在你的onCreate中來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout xml。

上面這兩種方式實現對於橫豎屏的切換載入不同的佈局檔案,都會讓activity重新載入一次,那麼必然就會導致資料的丟失或者是資料的重新獲取,造成了過多的額外的功耗,那麼我們可以在翻轉之前儲存一下現在已經獲取到的資料,那麼在翻轉之後就可以直接使用,而不需要重新獲取或者重新載入,具體在下面看

  • 重寫Activity.onRetainNonConfigurationInstance(),使用者橫豎屏切換前儲存資料
  • 在onCreate()函式中呼叫getLastNonConfigurationInstance(),獲取onRetainNonConfigurationInstance()儲存的資料
重寫Activity.onRetainNonConfigurationInstance(),使用者橫豎屏切換前儲存資料
 
@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(); 
 
    } 
 
    ... 
 
}

3.非重啟Activity的橫豎屏切換的處理

雖然重啟Activity為我們提供了儲存資料和讀取資料的方式,但是如此一來程式會顯得有些繁瑣,所以有時候程式設計師往往就不想讓Activity重啟,Android也為我們提供瞭解決方案,就是通過onConfigurationChanged攔截橫豎屏變換,從而進行必要的重新佈局和切換操作。

操作步驟如下:

  • 首先,manifest中為相應的Activity設定android:configChanges屬性,從而讓Activity不延續上述的重建流程
Andorid 3.2以前的SDK可以使用如下配置
 
android:configChanges="orientation|keyboardHidden"
 
而Adnroid 3.2以後的SDK必須新增一個screenSize屬性,具體如下
 
android:configChanges="keyboardHidden|orientation|screenSize"
 
或者
 
android:configChanges="orientation|screenSize"
  • 然後重寫activity中onConfigurationChanged 方法
@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
                  if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_
LANDSCAPE){
         //TODO
          }else
               if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_
PORTRAIT){
           //TODO
         }
}