一、屏幕橫豎屏切換的代碼
(一)設置屏幕橫屏代碼
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
(二)設置屏幕豎屏的代碼
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">
1
2
3
4
(一)configChanges屬性
設置configChanges這個值就可以避免Activity生命周期被回調,下面是這個值的詳細說明:
configChanges屬性可以設置多個值,中間使用豎線分割;
- orientation 屏幕在縱向和橫向間旋轉
2.keyboardHidden 鍵盤顯示或隱藏
3.screenSize 屏幕大小改變了
4.fontScale 用戶變更了首選的字體大小
5.locale 用戶選擇了不同的語言設定
6.keyboard 鍵盤類型變更,例如手機從12鍵盤切換到全鍵盤
7.touchscreen或navigation 鍵盤或導航方式變化,一般不會發生這樣的事件
其中前面三個是常用的,后面的屬性很少用!
如果要Activity中的生命周期不回調,就要設置:
android:configChanges="orientation|keyboardHidden|screenSize"
1
注意一定要設置這三個值,否是生命周期會被回掉。
這里我吐槽一下網上的文章,很多都是說設置了“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中已經定義了:
android:configChanges="orientation"
1
之后onConfigurationChanged才能得到回調。
onConfigurationChanged方法是在xml文件中定義了屬性后,并且視圖顯示后屏幕的方向發生改變,這個方法才會被回調。
在onConfigurationChanged可以拿到屏幕改變后的屏幕方向的值,確認屏幕的方向。很多操作也是可以在這個回調方法中執行。
(三)screenOrientation屬性
這個屬性相對來說就沒那么多人使用了,但是也是有用的,它可以設置屏幕默認的方向,但是僅僅是默認顯示,設置后還是可以在代碼中改變屏幕的方向的!
screenOrientation有如下選項:
1.unspecified 默認值,由系統判斷狀態自動切換
2.landscape 橫屏
portrait 豎屏
4.user 用戶當前設置的orientation值behind 下一個要顯示的Activity的orientation值
sensor 使用傳感器 傳感器的方向
-
nosensor 不使用傳感器 基本等同于unspecified
screenOrientation只能選擇一個值!一般設置都是橫屏或豎屏,其他也是很少使用的。 上面也說了這里只是設置的一個默認值,屏幕的方向是可以通過代碼被改變。 如果你想一直保持橫屏或豎屏,可以在onConfigurationChanged方法后設置屏幕的方向。
總結:
注:以上結果是在android 27(>android 13)上測試得到的結果。
大于Android 3.2(API Level 13)
不設置Activity的android:configChanges,或設置Activity的android:configChanges="orientation"時,或是設置android:configChanges="orientation|keyboardHidden,切屏會重新調用各個生命周期,且都只執行一次。
設置Activity的android:configChanges="orientation|screenSize"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法。
小于等于Android 3.2(API Level 13)
不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次。
設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次。
設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法。