一般的我們去切換屏幕方向都是不希望Activity被重新創建,這時就需要對一些屬性進行設置,或者使用代碼設置。
今天想學一下Android屏幕橫豎屏切換,但是網上很多知識不准確或不正確,這里我還是自己總結一篇文章,供大家參考。
一.屏幕橫豎屏切換的代碼
很多文章一上來就將什么生命周期或者亂七八糟的,我認為你首先要會橫豎屏切換啊!
(一)設置屏幕橫屏代碼
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
這個在Activity下可以直接使用
(二)設置屏幕豎屏的代碼
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
(三)判斷屏幕是橫屏還是豎屏的狀態
/** *系統中定義: int ORIENTATION_PORTRAIT = 1; 豎屏 *系統中定義: int ORIENTATION_LANDSCAPE = 2; 橫屏 */ //獲取屏幕的方向 ,數值1表示豎屏,數值2表示橫屏 int screenNum = getResources().getConfiguration().orientation;
這里啰嗦一句:
PORTRAIT 翻譯是肖像的意思,肖像一般都是豎直方向的吧
LANDSCAPE 翻譯是景觀的意思,景象一般是要橫着看的吧,才能看得比較多
這是我對系統定義橫豎屏字面的理解。
二.橫豎屏切換Activity生命周期回調
我今天測試了一下,發現很多文章描述這里並不正確!
橫豎屏屬性設置可以在AndroidManifest.xml中設置
代碼:
<activity android:name="MyActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="portrait" android:label="@string/app_name">
(一)configChanges屬性
設置configChanges這個值就可以避免Activity生命周期被回調,下面是這個值的詳細說明:
configChanges屬性可以設置多個值,中間使用豎線分割;
1. orientation 屏幕在縱向和橫向間旋轉
2.keyboardHidden 鍵盤顯示或隱藏
3.screenSize 屏幕大小改變了
4.fontScale 用戶變更了首選的字體大小
5.locale 用戶選擇了不同的語言設定
6.keyboard 鍵盤類型變更,例如手機從12鍵盤切換到全鍵盤
7.touchscreen或navigation 鍵盤或導航方式變化,一般不會發生這樣的事件
其中前面三個是常用的,后面的屬性很少用!
如果要Activity中的生命周期不回調,就要設置:
android:configChanges="orientation|keyboardHidden|screenSize"
注意一定要設置這三個值,否是生命周期會被回掉。
這里我吐槽一下網上的文章,很多都是說設置了“orientation“和”keyboardHidden”屬性就可以避免Activity生命周期的回調,其實不對。因為這是android很久以前版本的SDK才有效,我也是通過實驗和看別人一些經驗才知道的,很多文章沒有提到這個“ScreenSize”屬性,這也是近幾年才出現的,但是也是要必須設置的,你不試過的話就不知道!
如果只設置”orientation|screenSize”,會發生豎屏變橫屏生命周期會有先銷毀后重新onCreate,如果是橫屏變豎屏生命周期方法不會被回調!
(二)onConfigurationChanged方法
在Activity中可以重寫這個方法:
//屏幕方向發生改變的回調方法 @Override public void onConfigurationChanged(Configuration newConfig) { if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { text_screen.append("\n 當前屏幕為橫屏"); } else { text_screen.append("\n 當前屏幕為豎屏"); } super.onConfigurationChanged(newConfig); Log.e("TAG", "onConfigurationChanged"); // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //設置橫屏 }
前提是AndroidMainfest.xml中已經定義了:
之后onConfigurationChanged才能得到回調。
onConfigurationChanged方法是在xml文件中定義了屬性后,並且視圖顯示后屏幕的方向發生改變,這個方法才會被回調。
在onConfigurationChanged可以拿到屏幕改變后的屏幕方向的值,確認屏幕的方向。很多操作也是可以在這個回調方法中執行。
(三)screenOrientation屬性
這個屬性相對來說就沒那么多人使用了,但是也是有用的,它可以設置屏幕默認的方向,但是僅僅是默認顯示,設置后還是可以在代碼中改變屏幕的方向的!
screenOrientation有如下選項:
1.unspecified 默認值,由系統判斷狀態自動切換
2.landscape 橫屏
3. portrait 豎屏
4.user 用戶當前設置的orientation值
5. behind 下一個要顯示的Activity的orientation值
6. sensor 使用傳感器 傳感器的方向
7. nosensor 不使用傳感器 基本等同於unspecified
screenOrientation只能選擇一個值!一般設置都是橫屏或豎屏,其他也是很少使用的。
上面也說了這里只是設置的一個默認值,屏幕的方向是可以通過代碼被改變。
如果你想一直保持橫屏或豎屏,可以在onConfigurationChanged方法后設置屏幕的方向。
(三)生命周期的知識
系統不同會導致切屏出現不同的反應,查看網上資料發現,好像手機品牌不同也會出現不同的反應。
橫豎屏切換 1 切換到橫屏,然后切換到豎屏,銷毀了兩次 onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume 2 修改AndroidManifest.xml,把該Activity添加 android:configChanges="orientation",切橫屏,再切回豎屏,發現不會再打印相同信息,只銷毀一次,但多打印了一行onConfigChanged onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume onConfigurationChanged 3 更改android:configChanges="orientation|keyboardHidden",切橫屏,再切回豎屏,就只打印onConfigChanged onConfigurationChanged onConfigurationChanged
(四)Activity的生命周期
當復習一下:
onCreate、onStart、onResume、onPause、onStop、onDestory、onRestart,一共七個生命周期的方法