1. 程式人生 > >Android橫豎屏切換小結

Android橫豎屏切換小結

Android開發中,大多APP可能根據實際情況直接將APP的介面方向設死了,或豎屏或橫屏。但是,我們還是會遇到橫豎屏切換的功能需求,不管是通過物理重力感應觸發,還是使用者手動觸發。所以,我們有必要去弄清楚Android中橫豎屏切換到底做了什麼。

一、android:screenOrientation & android:configChanges

  • android:screenOrientation
    是用來設定 activity在裝置上的顯示方向的,只能是下面的唯一值:
描述
unspecified 預設值,系統自動選擇螢幕方向
behind 跟activity堆疊中的下面一個activity的方向一致
landscape 橫屏方向,顯示的寬比高長
portrait 豎屏方向,顯示的高比寬長
sensor 由裝置的物理方向感測器決定,如果使用者旋轉裝置,這螢幕就會橫豎屏切換
nosensor 忽略物理方向感測器,這樣就不會隨著使用者旋轉裝置而橫豎屏切換了(”unspecified”設定除外)
user 使用者當前首選的方向
reverseLandscape API 9 以上,反向橫屏
reversePortrait API 9 以上,反向豎屏
sensorLandscape API 9 以上,橫屏,但是可以根據 物理方向感測器來切換正反向橫屏
sensorPortrait API 9 以上,豎屏,但是可以根據 物理方向感測器來切換正反向豎屏
fullSensor API 9 以上,上下左右四個方向,由物理方向感測器決定
locked API 18 以上,鎖死當前螢幕的方向

如果你上傳應用到 Google Play,需要注意以下提示:
Note: When you declare one of the landscape or portrait values, it is considered a hard requirement for the orientation in which the activity runs. As such, the value you declare enables filtering by services such as Google Play so your application is available only to devices that support the orientation required by your activities. For example, if you declare either”landscape”, “reverseLandscape”, or “sensorLandscape”, then your application will be available only to devices that support landscape orientation. However, you should also explicitly declare that your application requires either portrait or landscape orientation with the element. For example, . This is purely a filtering behavior provided by Google Play (and other services that support it) and the platform itself does not control whether your app can be installed when a device supports only certain orientations.


* android:configChanges

用來設定 activity配置改變(不僅僅是螢幕方向,還有語言、地區等等)的集合。當一個配置改變在執行中發生時,activity預設情況下會先銷燬然後重新建立。但是,如果通過這個屬性聲明瞭某個配置後,將可以避免上面的情況,而是依然執行,並回調 onConfigurationChanged() 方法。該屬性可以設定多個值:

描述
mcc IMSI移動臺的國家程式碼(MCC)發生變化——一個SIM被探測到並且更新MCC
mnc IMSI移動臺的網路程式碼(MNC)發生變化——一個SIM被探測到並且更新MNC
locale 區域發生變化——使用者選擇了一個文字需要顯示的新語言
keyboard 鍵盤型別發生變化——例如:使用者插入了外接鍵盤。
keyboardHidden 鍵盤的可訪問性發生變化——例如:使用者發現了硬體鍵盤。
screenLayout 屏幕布局發生變化——這個會導致顯示不同的Activity。
orientation 螢幕方向發生變化——使用者旋轉了螢幕。注意:如果應用程式的目標API級別是13或更高(通過屬性minSdkVersion和屬性targetSdkVersion宣告),你也需要宣告配置項screenSize,因為這將在裝置選擇肖像和螢幕方向時發生改變。
screenSize 當前可用螢幕大小發生變化。這代表一個當前可用大小的變化,和當前的比率相關,因此當用戶選擇不同的畫面和影象,會發生變化。然而,如果你的程式目標API級別是12或更低,你的Activity總是會自己處理這個配置變化(這個變化不會引起Activity的重啟,甚至在Android 3.2或更新的裝置上)。在API級別13里加入的。
smallestScreenSize 物理螢幕大小的變化。不管方向的變化,僅僅在實際物理螢幕打包變化的時候,如:外接顯示器。這個配置項的變化引起在smallestWidth configuration裡的變化。然而,如果你的程式目標API級別是12或更低,你的Activity將自己處理這個變化(這個變化不會引起Activity的重啟,甚至在Android 3.2或更新的裝置上)在API級別13里加入的。
layoutDirection 佈局方向變化。例如書寫方式從左向右(LTR)轉換為從右向左(RTL)

想了解更多就看官方文件

二、橫豎屏切換對Activity生命週期的影響

通過列印Activity各個生命週期的執行情況,我們根據以下幾種情況來分析:

1. 不配置 configChanges

2. 配置 android:configChanges=”orientation”

3. 配置 android:configChanges=”orientation|keyboardHidden”

  • 豎屏切橫屏
11-02 20:17:44.898 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onPause
11-02 20:17:45.008 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onSaveInstanceState
11-02 20:17:45.008 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onStop
11-02 20:17:45.018 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onDestroy
11-02 20:17:45.038 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onCreate - orientation
11-02 20:17:45.088 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onStart
11-02 20:17:45.088 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onRestoreInstanceState
11-02 20:17:45.088 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onResume
  • 橫屏切豎屏:
11-02 20:19:00.268 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onPause
11-02 20:19:00.268 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onSaveInstanceState
11-02 20:19:00.268 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onStop
11-02 20:19:00.268 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onDestroy
11-02 20:19:00.318 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onCreate - orientation
11-02 20:19:00.338 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onStart
11-02 20:19:00.338 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onRestoreInstanceState
11-02 20:19:00.338 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onResume

從上面的 3種方式配置 列印的 Log (三種方式 Log是一樣的,故合併顯示),我們可以總結如下:

不設定Activity的android:configChanges時,或 設定Activity的android:configChanges=”orientation”時,或設定Activity的android:configChanges=”orientation|keyboardHidden”時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行一次方法。

而我們經常在其他地方看到的結論如下:

1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設定Activity的android:configChanges=”orientation”時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次
3、設定Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法

4. 所以是什麼原因導致我們的結論不一樣呢?

需要說明的是: 我的測試環境是 targetSdkVersion 24,測試模擬器是 系統API 5.0!

檢視官方文件,發現有如下提示:

注意:從 Android 3.2(API 級別 13)開始,當裝置在縱向和橫向之間切換時,“螢幕尺寸”也會發生變化。因此,在開發針對 API 級別 13 或更高版本系統的應用時,若要避免由於裝置方向改變而導致執行時重啟(正如 minSdkVersion 和 targetSdkVersion 屬性中所宣告),則除了”orientation”值以外,您還必須新增 “screenSize”值。即,您必須宣告 android:configChanges=”orientation|screenSize”。但是,如果您的應用是面向 API 級別 12 或更低版本的系統,則 Activity 始終會自行處理此配置變更(即便是在 Android 3.2 或更高版本的裝置上執行,此配置變更也不會重啟 Activity)。

我們現在測試第四種配置方式。

5. 配置

android:configChanges="orientation|keyboardHidden|screenSize"
  • 豎屏切橫屏
11-02 20:44:06.568 7792-7792/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onConfigurationChanged
  • 橫屏切豎屏
11-02 20:44:52.918 7792-7792/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onConfigurationChanged

結論: 從 API 13開始,配置 android:configChanges=”orientation|keyboardHidden|screenSize”,才不會銷燬 activity,且只調用 onConfigurationChanged方法。


6. 橫豎屏切換小結

  • (一)、Android 3.2 (API 級別 13)以前
    1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
    2、設定Activity的android:configChanges=”orientation”時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次。
    3、設定Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法。

注意: 不設定Activity的android:configChanges時,切換豎屏activity的各個生命週期執行兩次,有人說是 在API 2.x下,我未測試,大家可以考證下。

  • (二)、從 Android 3.2 (API級別 13)開始
    1、不設定Activity的android:configChanges,或設定Activity的android:configChanges=”orientation”,或設定Activity的android:configChanges=”orientation|keyboardHidden”,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行一次。
    2、配置 android:configChanges=”orientation|keyboardHidden|screenSize”,才不會銷燬 activity,且只調用 onConfigurationChanged方法。

三、程式碼中動態切換橫豎屏

在程式碼中切換螢幕的方向主要呼叫 setRequestedOrientation(int requestedOrientation) 方法,此方法的作用等同於在 AndroidManifest.xml設定Activity 的android:screenOrientation,所以,其可傳遞的引數如 android:screenOrientation表格中一樣。

示例程式碼:

findViewById(R.id.btn_click).setOnClickListener(new View.OnClickListener() {  
  @Override 
   public void onClick(View view) {   
     Log.d(TAG,"被點選了");  
      //判斷當前螢幕方向  
      if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {     
       //切換豎屏   
         MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);   
      }else{   
         //切換橫屏     
         MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
      } 
   }
});

非重啟Activity模式:即設定了android:configChanges=”orientation|keyboardHidden|screenSize”,Log輸出(橫豎屏切換一樣)

11-03 10:38:33.998 20317-20317/com.ys.yoosir.screenconfigchange D/MainActivity: 被點選了
11-03 10:38:34.108 20317-20317/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onConfigurationChanged
重啟Activity模式:即沒有設定android:configChanges="orientation|keyboardHidden|screenSize",Log輸出(橫豎屏切換一樣)

11-03 10:59:23.268 7724-7724/com.ys.yoosir.screenconfigchange D/MainActivity: 被點選了
11-03 10:59:23.368 7724-7724/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onPause
11-03 10:59:23.368 7724-7724/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onSaveInstanceState
11-03 10:59:23.368 7724-7724/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onStop
11-03 10:59:23.368 7724-7724/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onDestroy
11-03 10:59:23.428 7724-7724/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onCreate - orientation
11-03 10:59:23.458 7724-7724/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onStart
11-03 10:59:23.458 7724-7724/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onRestoreInstanceState
11-03 10:59:23.458 7724-7724/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onResume

注意: 通過 setRequestedOrientation(int requestedOrientation) 修改了螢幕方向後,就類似於設定了android:screenOrientation,效果是一樣的,比如:呼叫setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT),無論螢幕怎麼旋轉,都不會切換螢幕方向。如果要恢復為響應橫豎屏隨物理方向感測器裝置變換,那麼就需要手動呼叫類似setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);程式碼進行恢復。

四、橫豎屏切換我們需要做的事

  • 重啟Activity模式
    在重啟Activity模式下,橫豎屏切換的時候會導致資料丟失,我們可以通過如下程式碼來保正資料不丟失:
@Overrideprotected
void onSaveInstanceState(Bundle outState) { 
 Log.d(TAG," -- onSaveInstanceState"); 
 Log.d(TAG," -- onSaveInstanceState save: name = yoosir,age = 24,handsome = ture"); 
 outState.putString("name","yoosir"); 
 outState.putInt("age",24); 
 outState.putBoolean("handsome",true); 
 super.onSaveInstanceState(outState);
}
....
@Overrideprotected
void onRestoreInstanceState(Bundle savedInstanceState) { 
 super.onRestoreInstanceState(savedInstanceState); 
 Log.d(TAG," -- onRestoreInstanceState"); 
 if(savedInstanceState != null) { 
     String name = savedInstanceState.getString("name"); 
     int age = savedInstanceState.getInt("age"); 
     boolean isHandsome = savedInstanceState.getBoolean("handsome"); 
     Log.d(TAG, " -- onRestoreInstanceState get: name = " + name + ",age = " + age + ",handsome = " + isHandsome); 
 }}

橫豎屏切換Log 輸出:

11-03 12:03:31.678 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onPause
11-03 12:03:31.678 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onSaveInstanceState
11-03 12:03:31.678 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onSaveInstanceState save: name = yoosir,age = 24,handsome = ture
11-03 12:03:31.688 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onStop
11-03 12:03:31.688 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onDestroy
11-03 12:03:31.758 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onCreate - orientation
11-03 12:03:31.758 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onCreate get: name = yoosir,age = 24,handsome = true
11-03 12:03:31.788 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onStart
11-03 12:03:31.788 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onRestoreInstanceState
11-03 12:03:31.788 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onRestoreInstanceState get: name = yoosir,age = 24,handsome = true
11-03 12:03:31.788 3663-3663/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onResume

如上,大家可以看到在 onCreate() 中也是可以拿到我們之前儲存的資料的。

補充一點: 如果大家在資源目錄res 中添加了 layout-land(橫向佈局資料夾) 和 layout-port (豎想佈局資料夾),重啟Activity模式的橫豎屏切換,系統會自動幫我們顯示正確方向的佈局UI。

  • 非重啟Activity模式
    非重啟Activity模式下橫豎屏切換,我們的Activity 不會銷燬重建,資料也不會丟失。但是,如果我們想根據不同的螢幕方向來展示不同UI或做不同的事,應該怎麼做呢?直接上程式碼:
@Overridepublic void onConfigurationChanged(Configuration newConfig) { 
 super.onConfigurationChanged(newConfig); 
 Log.d(TAG," -- onConfigurationChanged"); 
 if(newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){ 
     //切換到豎屏  
    //修改佈局檔案  
    setContentView(R.layout.activity_main);  
    //findViewById ....   
   //TODO something  
    Log.d(TAG," -- onConfigurationChanged  可以在豎屏方向 to do something"); 
 }else{  
    //切換到橫屏  
    //修改佈局檔案  
    setContentView(R.layout.activity_main);  
    //findViewById ....  
    //TODO something  
    Log.d(TAG," -- onConfigurationChanged  可以在橫屏方向 to do something"); 
 }
}

橫豎屏切換Log 輸出:

11-03 14:56:50.465 28612-28612/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onConfigurationChanged
11-03 14:56:50.495 28612-28612/com.ys.yoosir.screenconfigchange D/MainActivity:  -- onConfigurationChanged  可以在橫屏方向 to do something

大家可以看到,在非重啟Activity模式下,橫豎屏切換修改UI佈局檔案時,其實挺麻煩的(我是這樣的看法,^_~),需要重新初始化一遍UI。不過,不需要我們手動儲存資料倒是挺方便的。

五、橫豎屏切換對Fragment的影響

列印 Activity 和 Fragment 各個生命週期,並在Activity 的 onCreate() 中新增如下程式碼:

//是否已經 add 了 Fragment
if(getSupportFragmentManager().findFragmentByTag("child") == null) {
    Log.d(TAG, " -- onCreate has no child ");
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    blankFragment = BlankFragment.newInstance("one", "two");
    fragmentTransaction.add(R.id.root_view, blankFragment, "child");
    fragmentTransaction.commit();
}else{
    Log.d(TAG, " -- onCreate has child ");
}
  • 重建Activity模式
    Log: 帶有 BlankFragment 即為 Fragment 的列印,其他則為 Activity 的列印
    進入Activity的Log: 我們可以關注下第 2 行log——– onCreate has no child
11-03 17:56:19.465 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onCreate - orientation
11-03 17:56:19.525 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onCreate has no child 
11-03 17:56:19.545 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- newInstance 
11-03 17:56:19.545 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onAttach 
11-03 17:56:19.545 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onCreate 
11-03 17:56:19.545 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onCreateView 
11-03 17:56:19.585 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onActivityCreated 
11-03 17:56:19.585 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onStart 
11-03 17:56:19.585 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onStart
11-03 17:56:19.585 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onResume
11-03 17:56:19.585 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onResume 
11-03 17:57:02.285 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity: -- one btn click 
11-03 17:57:05.705 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity: -- two btn click


橫豎屏切換的Log:

1、我們關注一下 第17行 onCreate has child ,所以 Fragment 本身是沒有被 destroy,它的views 是被destroy 的

2、關注一下 第5、6、19 和 20 行,Fragment 的區域性變數資料被銷燬了,我們可以在onSaveInstanceState 儲存資料,雖然 Fragment 不像 Activity 擁有 onRestoreInstanceState 方法,但是我們可以在 onActivityCreated 中獲取之前儲存的資料。

11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onPause 
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onPause
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onSaveInstanceState
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onSaveInstanceState save: name = yoosir,age = 24,handsome = ture
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onSaveInstanceState 
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onSaveInstanceState save str
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onStop 
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onStop
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onDestroyView 
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onDestroy 
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onDetach 
11-03 17:57:40.095 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onDestroy
11-03 17:57:40.165 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onAttach 
11-03 17:57:40.165 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onCreate 
11-03 17:57:40.165 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onCreate - orientation
11-03 17:57:40.165 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onCreate get: name = yoosir,age = 24,handsome = true
11-03 17:57:40.175 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onCreate has child 
11-03 17:57:40.175 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onCreateView 
11-03 17:57:40.185 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onActivityCreated 
11-03 17:57:40.185 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onActivityCreated get 我設定了引數
11-03 17:57:40.185 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onStart 
11-03 17:57:40.185 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onStart
11-03 17:57:40.195 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onRestoreInstanceState
11-03 17:57:40.195 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onRestoreInstanceState get: name = yoosir,age = 24,handsome = true
11-03 17:57:40.195 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onResume
11-03 17:57:40.195 26990-26990/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onResume
  • 非重建Activity模式:
    橫豎屏切換Log(進入Activity的Log 與 重建Activity模式一樣 ):橫豎屏切換時,Fragment 和 Activity 都只會呼叫 onConfigurationChanged 方法。
11-03 18:31:21.725 27309-27309/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onConfigurationChanged 
11-03 18:31:21.725 27309-27309/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onConfigurationChanged
11-03 18:31:21.725 27309-27309/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onConfigurationChanged  可以在橫屏方向 to do something
11-03 18:31:36.545 27309-27309/com.ys.yoosir.screenconfigchange D/Main2Activity:  BlankFragment -- onConfigurationChanged 
11-03 18:31:36.545 27309-27309/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onConfigurationChanged
11-03 18:31:36.545 27309-27309/com.ys.yoosir.screenconfigchange D/Main2Activity:  -- onConfigurationChanged  可以在豎屏方向 to do something

六、其他小技巧

如果我們應用是手機和平板都可用的,且手機的只能是豎屏不可切換,平板的只能是橫屏不可切換。首先,我們要區分裝置是手機還是平板,然後設定螢幕方向。程式碼如下:

/**
 * 判斷是否平板裝置
 * @param context
 * @return true:平板,false:手機 
*/
private boolean isTabletDevice(Context context) {
    return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOU