在Android裡禁止橫豎屏是否搞錯了什麼
最近有個小需求,需要禁止指定的fragment進行橫豎屏切換。
由此引出了本文,算是對該需求知識點的一個小結。
首先簡單的說下一般橫豎屏切換的基本操作。網上的部落格大多數都是針對activity做的,即禁止當前activity。至於說橫豎屏切換後生命週期的變化或如何解決由於橫豎屏切換導致需要儲存資料的問題,已有很多前輩高手去寫,這裡不再累述。確實有需要,請留言,菜雞會在本文末尾進行補充說明。
針對Activity
方式一:在AndroidManifest.xml中定義
A、AndroidManifest.xml中禁止橫豎屏切換實現
要禁止橫豎屏切換我們只需在AndroidManifest.xml檔案中對應的Activity的標籤中新增屬性android:screenOrientation即可。屬性為android:screenOrientation=" portrait"時表示該Activity只能豎屏顯示,屬性為android:screenOrientation="landscape"時表示該Activity只能橫屏顯示。設定android:screenOrientation橫豎屏後,將關閉該activity自由切換橫豎屏的功能。
補充:
B、AndroidManifest.xml中禁止橫豎屏切換時重啟Activity實現
要禁止橫豎屏切換重啟Activity我們只需在AndroidManifest.xml檔案中對應的Activity的標籤中新增android:configChanges="orientation"屬性即可。
我們打出log日誌比較下他們的生命週期回撥
1、預設情況下生命週期
第一次進入介面
切換成橫屏時
切換成豎屏時
2、在AndroidManifest.xml設定Activity標籤屬性android:configChanges=”orientation”後
第一次進入介面
切換成橫屏時
成功了……咦,are you kidding me?別慌……別慌……別慌
注意,重點來了,也是給不負責隨便拷貝的哥們兒說一聲,請別誤人子弟。
自己在5.1手機上除錯發現橫豎屏切換時,並沒有執行onConfigurationChanged()方法,依舊銷燬當前Activity並建立新的Activity例項。
搜尋發現:這個屬性在低版本上是可以起作用。在android 4.0 以上不起作用,必須要加上screenSize,即android:configChanges="orientation|screenSize",好了,我們再試一試
切換成橫屏時:
切換成豎屏時:
好了,達到上面的目的了。
至於想了解更多android:configChanges相關屬性的哥們兒,請看官方文件,這裡不再累述。
方式二:在Activity中定義,禁止橫豎屏切換
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)或setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
好了,該Activity的橫豎屏禁止生效。
ok,走入我們前文說到的需求點。指定某個fragment禁止橫豎屏切換
針對fragment
其核心實現,依然時和針對activity的寫法是一樣的,不過他的麻煩之處在於對fragment禁止橫豎屏切換的時機和釋放禁止橫豎屏切換的時機。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)或setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
此操作會將他所在的Activity一起給禁止掉橫豎屏切換,基於該Activity的fragment也會被禁掉橫豎屏切換的功能,這樣就與需求不合,所以我們需要尋找一個時機去解除掉禁掉橫豎屏切換。
解除的關鍵程式碼 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);此解除的關鍵在於fragment中的呼叫時機。
好了,大功告成。
這樣操作僅會禁止當前的fragment橫豎屏切換的功能而不會影響其他fragment介面的橫豎屏切換。