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屏幕旋轉的適配和常用操作技巧就介紹完了,歡迎大家在下面留言。
[本篇源碼下載]
(http://download.csdn.net/detail/leejizhou/9500995)