Android 橫豎屏切換載入不同的佈局
阿新 • • 發佈:2018-12-11
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物件,這是因為通常情況下軟體在橫豎屏之間切換,介面的高寬會發生轉換,從而可能會要求不同的佈局。
- 在res目錄下建立layout-land和layout-port目錄,相應的layout檔名不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程式自己會呼叫Activity的onCreate方法,從而根據當前橫豎屏情況自動載入響應的佈局。
- 假如佈局資源是不一樣又不按照如上設定,則需要通過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
}
}