橫豎屏切換是開發中經常碰到的,下面就來看看安卓橫豎屏切換時發生了什麼。
這是關於activity生命週期的一個延伸,探討下安卓設備在橫豎屏切換的時候,會發生什麼?
在安卓設備在橫豎屏切換的時候有三種情況:
第一種情況:
不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
第二種情況:
設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次
第三種情況:
設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
下面貼張圖:
那麼,有的童鞋可能說了,我不想讓自己的app進行橫豎屏切換照成不必要的麻煩,我改怎麼辦呢?
如果不想讓軟件在橫豎屏之間切換:
可以通過在安卓的清單文件中配置:
AndroidManifest.xml中設置activity中的Android:screenOrientation屬性值來實現。
比如下列設置
android:screenOrientation="portrait"
則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。
android:screenOrientation="landscape",爲橫屏顯示
或者,我們也可以在代碼中設置:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
"unspecified":默認值 由系統來判斷顯示方向.判定的策略是和設備相關的,所以不同的設備會有不同的顯示方向.
"landscape":橫屏顯示(寬比高要長)
"portrait":豎屏顯示(高比寬要長)
"user":用戶當前首選的方向
"behind":和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
"sensor":有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換。
"nosensor":忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了("unspecified"設置除外)。
也可以在Java代碼中通過setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)來設置
下面是一些屬性:
unspecified":默認值 由系統來判斷顯示方向.
"landscape":橫屏顯示
"portrait":豎屏顯示
"user":用戶當前首選的方向
"behind":和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
"sensor":有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換。
"nosensor":忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了("unspecified"設置除外)
關於橫豎屏適配
橫豎屏配我們可以從以下幾個方面來着手:
1,使用相對佈局
2,使用權重
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/base14dp"
android:layout_weight="1"
android:orientation="vertical"
android:paddingTop="@dimen/base5dp">
3,不要固定寬高,使用wrap_content、match_parent
4,橫豎屏分別佈局
在資源文件目錄下創建layout-land 橫屏, layout-port
豎屏 。然後把layout中的xml文件分別考到以上目錄,修改佈局就可以了。代碼中不做任何更改。
5,使用點9圖片作爲背景圖片
6,使用3~5套不同尺寸的備用位圖
- xhdpi:2.0
- hdpi:1.5
- mdpi:1.0(最低要求)
- ldpi:0.75
7,動態計算dp值
付一張項目開發中的動態dp值圖