橫豎屏切換——安卓開發員必踩的坑

橫豎屏切換是開發中經常碰到的,下面就來看看安卓橫豎屏切換時發生了什麼。

這是關於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值圖


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章