編輯:關於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()
再次運行看看效果
vcbBxLu9+NDQ0P3XqqOsQWN0aXZpdHm9+NDQz/q72dbYvai688r9vt3SwMi7tObU2jwvcD4NCjxwPtfuuvPU2b3pydy49re9t6ijrMrWtq/Iw0FjdGl2aXR5vfjQ0ND916o8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;">
//設置Activity橫屏顯示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//設置Activity豎屏顯示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
到此一些關於Android屏幕旋轉的適配和常用操作技巧就介紹完了,歡迎大家在下面留言。
先不講那麼多看效果圖:下面來講解一些更新CODE,原理大家都知道,不廢話,直接上代碼。裡面有一些是我自己做的測試例子,所以大家可以直接刪掉就好了第一個:activity_
一、概述大家編寫項目的時候,肯定會或多或少的使用Log,尤其是發現bug的時候,會連續在多個類中打印Log信息,當問題解決了,然後又像狗一樣一行一行的去刪除剛才隨便添加的
前言:總想寫點自己的東西,因為很多Android知識網上大部分都有教程,這樣寫的話總是忍不住借鑒別人寫的東西,再加入點自己的一些元素,我只好對網上的各種知識,我認為很多知
ContactPicker(選擇聯系人) 詳解 ContactPicker:用戶可以選擇一個聯系人. 1. 創建ContactP