Android 螢幕旋轉相關解析
這篇博文給大家介紹下,當手機螢幕旋轉時我們應當怎麼去處理,首先了解下預設情況下Android進行螢幕旋轉的原理,當手機進行旋轉時重力感應sensor起到作用,會將Activity銷燬並按照橫屏的螢幕尺寸進行重新構造,生命週期如下圖所示,一句話總結就是預設情況下Activity進行螢幕旋轉會自動進行onDestroy並重新onCreate。
*onSaveInstanceState和onRestoreInstanceState用處後面會介紹到。
先介紹2種非預設情況下的操作
1:禁止螢幕旋轉
在AndroidManifest.xml的Activity中配置
始終豎屏
android: screenOrientation="portrait"
始終橫屏
android:screenOrientation="landscape"
2:Activity跟隨旋轉但不銷燬和重啟
這個實現原理是告訴系統這個Activity的旋轉處理由我們自己去處理,不用幫我銷燬和重啟
在AndroidManifest.xml的Activity中配置
android:configChanges="keyboardHidden|orientation|screenSize"
然後在Activity中進行方法複寫,監聽螢幕旋轉並處理
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(MainActivity.this, "豎屏模式", 3000).show();
} else {
Toast.makeText(MainActivity.this , "橫屏模式", 3000).show();
}
}
接下來介紹,Activity進行預設旋轉時候的處理,當螢幕進行旋轉的時候會按照橫屏的解析度進行重繪,當然你也可以不進行任何處理難看就難看唄:),理想狀態的處理就是建立兩套同名的Layout,當螢幕旋轉時系統會自動幫我們載入橫屏的Layout。
首先在工程res目錄下新建一個layout-land 這個目錄下是專門為橫屏Layout準備的
然後建立一個同名不同樣的佈局檔案就Ok了,我在豎屏的Layout建立了上下的Button在橫屏的Layout建立了橫排並列的Button
看一下執行效果
可以看到系統已經幫我們自動在橫豎屏轉換的時候切換了Layout,這樣就實現了橫豎屏的基本適配,但是這樣簡單的處理會出現問題,什麼問題呢?當我們點選第一個Button為TextView設定字串後再旋轉螢幕看看會發生什麼?
執行後可以看到,我們已經為TextView設定了值但是螢幕旋轉後值卻不見了,這是因為之前說過的螢幕旋轉後系統自動幫我們銷燬了Activity所以之前設定的東西就不見了,這個怎麼去解決呢?這就要靠Android系統給我們提供的onSaveInstanceState和onRestoreInstanceState來進行資料的儲存和恢復,onSaveInstanceState會在onDestroy之前被呼叫,我們可以利用它來進行一些資料的儲存,這裡我們儲存TextView設定的值。
//儲存Activity資料
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("textview", mTextView.getText().toString());
super.onSaveInstanceState(outState);
}
然後我們在重啟Activity後如何得到之前儲存的資料呢?這裡有兩種方法
1:在onCreate中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView=(TextView)findViewById(R.id.textView);
//恢復資料
if (savedInstanceState != null) {
// Restore value of members from saved state
mTextView.setText(savedInstanceState.getString("textview"));
}
}
可以看到,onCreate的萬年不用的Bundle物件終於讓我們用上了。
2:第二種方法是複寫onRestoreInstanceState方法
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mTextView.setText(savedInstanceState.getString("textview"));
}
這裡不需要判斷Bundle物件是否為空,因為系統僅僅會在存在需要恢復的狀態資訊時才會呼叫 onRestoreInstanceState()
再次執行看看效果
可以看到螢幕進行旋轉,Activity進行銷燬重建後資料依然存在
最後再介紹個方法,手動讓Activity進行旋轉
//設定Activity橫屏顯示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//設定Activity豎屏顯示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
到此一些關於Android螢幕旋轉的適配和常用操作技巧就介紹完了,歡迎大家在下面留言。