亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android 橫豎屏處理的知識小結

2019-10-21 21:31:06
字體:
來源:轉載
供稿:網友

Android 手機一般都支持橫豎屏旋轉,系統也會提供一個設置,控制允不允許旋轉。這里對如何在 App 中控制界面的旋轉方向做一個小結。

界面旋轉方向的決定因素

決定一個界面顯示為橫屏/豎屏的因素有幾個:

  • 系統的設置項,一般可以設置為只允許豎屏或可旋轉切換。
  • 設備的物理傳感器感應到的設備方向。
  • 不同 App 里的代碼對橫豎屏的設置。

需要注意的一點是,這三個因素沒有固定的優先級。所以即使系統的設置項中設置了固定為豎屏,App 里的代碼也可以將界面設置為橫屏,當然影響的范圍僅限于 App 內部界面。

代碼中設置橫豎屏的方法

我們有2種方法設置橫豎屏:

在 AndroidManifest.xml 文件中,對 <activity> 標簽設置 android:screenOrientation 屬性,具體的值和作用見下文。
在 Java 中調用 Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) ,具體的值和作用見下文。

如果在 xml 中設置,則在初始化界面時就已經確定好其方向。而在如果 Java 中設置,則可以做到根據不同情況動態設置。

設置橫豎屏時傳入的值和作用

以下列出在 AndroidManifest.xml 中 <activity> 標簽的 android:screenOrientation 屬性的可能的值。如果采用 Java 方式設置,參數與之一一對應。(參考官方文檔 )

  • unspecified :默認值,不做任何指定,由系統來決定顯示方向。這將由上一個 activity 來決定,或者當 activity 處于棧底時由用戶設置的方向來決定。
  • landscape : 保持橫屏。
  • portrait : 保持豎屏。
  • user : 用戶當前設置的 orientation 值。
  • behide : 保持和上一個 Activity 的方向一致。
  • sensor : 完全根據物理傳感器的方向來決定。注意用這個值時會忽略用戶在系統設置中的旋轉開關狀態。(注意一般機器即使用這個值也不會支持豎屏旋轉180度)
  • nosensor : 忽略物理傳感器的方向。這將導致用戶旋轉手機時不會切換橫豎屏。
  • sensorLandscape : 保持橫屏,但可以根據物理傳感器來決定橫屏的方向。
  • sensorPortrait : 保持豎屏,但可以根據物理傳感器來決定豎屏的方向。
  • reverseLandscape : 保持橫屏,但方向與使用 landscape 時相反。
  • reversePortrait : 保持豎屏,但方向與使用 portrait 時相反。
  • fullSensor : 與 sensor 大致相同,區別在于這個屬性會允許4個方向都可以旋轉。
  • userLandscape : 保持橫屏,但可以在用戶允許旋轉的情況下,根據物理傳感器來決定橫屏的方向。(注意與 sensorLandscape 對比)
  • userPortrait : 保持豎屏,但可以在用戶允許旋轉的情況下,根據物理傳感器來決定豎屏的方向。(注意與 sensorPortrait 對比)
  • fullUser : 與 user 大致相同,區別在于如果用戶允許旋轉,這個屬性允許4個方向都可以旋轉。
  • locked : 屏幕方向會鎖定在當前方向,不能再旋轉。

該屬性的值有很多,但一般比較常用的幾個值也就幾個: unspecified (允許旋轉)、 landscape (固定為橫屏)、 portrait (固定為豎屏)。而且一般我們只需要在 AndroidManifest.xml 中指定好固定的值就可以了。除非你對橫豎屏切換有自己的一套邏輯,才需要在不同的邏輯下進行不同的設置。

橫豎屏切換時引起的 Activity 重新創建

默認情況下,橫豎屏切換會引起當前 Activity 銷毀然后重新創建。所以我們可以在 Activity 重新創建時根據當前橫豎屏狀態做一些差異化。最常見的就是根據橫豎屏采用不同的 layout xml。

在 res 目錄下建立 layout-land 和 layout-port 目錄,在不同目錄下分別放一個同名的 layout xml 文件,然后在代碼里正常使用這個 layout 文件,系統就會在橫豎屏切換并重新創建 Activity 時自動使用對應的 layout 文件。如:

@Overrideprotected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_layout);}

如果不想通過創建多個 layout 文件來區分橫豎屏布局,也可以用 Java 代碼來做一些差異化,只要使用以下判斷即可獲取當前橫豎屏的信息。

@Overrideprotected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_layout);  // 獲取橫豎屏信息  int orientation = getResources().getConfiguration().orientation;  if (orientation == Configuration.ORIENTATION_LANDSCAPE) {    // 針對橫屏做一些處理  } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {    // 針對豎屏做一些處理  }}

有一個點需要注意,關于 Activity 的生命周期被重新調用,有的資料說:

當不設置 Activity 的 android:configChanges 屬性時,切到橫屏時會重新執行一次生命周期,而切到豎屏時會執行兩次。

如果設置了 android:configChanges="orientation" 屬性,則都只會執行一次。

但是個人實驗沒有驗證出這個說法。保險起見,可以加上 android:configChanges="orientation" 屬性,確保生命周期只調用一次。

阻止橫豎屏切換時 Activity 重啟

雖然我們可以用上面的方法對橫豎屏做不同的布局,但是橫豎屏切換導致的 Activity 重新創建還會引起用戶當前狀態、數據的丟失。例如 EditText 中輸入到一半的文字在 Activity 重新創建后會丟失。所以如果有辦法能在旋轉屏幕時不重新創建 Activity,應該是更好的一種選擇。

我們可以在 AndroidManifest.xml 中為相應的 <activity> 設置 android:configChanges 屬性,讓它不在橫豎屏切換時引起 Activity 的重新創建。

Android 3.2(API Level 13)以前的 SDK 可以使用如下配置

android:configChanges="orientation|keyboardHidden" 

而 Android 3.2 以后的 SDK 則需要設置為

android:configChanges="keyboardHidden|orientation|screenSize" 

這樣一來,橫豎屏切換時 Activity 將不會重新創建。

橫豎屏切換時的回調

一旦我們按照上述方法設置了 android:configChanges 屬性,那么橫豎屏切換時 Activity 將不會重新創建,那么當屏幕旋轉時,我們在代碼上怎么感知呢?可以通過 Override Activity 和 View 的 onConfigurationChanged 方法。

@Override public void onConfigurationChanged(Configuration newConfig) {   super.onConfigurationChanged(newConfig);  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {     // 針對橫屏做一些處理  } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){     // 針對豎屏做一些處理  } }

判斷當前屏幕方向

有了上面的橫豎屏切換的回調,我們就可以及時感知到屏幕的狀態變化。但因為豎屏、橫屏都有兩個不同的方向,所以 Android 系統又提供了方法給我們獲取當前屏幕精確的旋轉方向。

Display display = activity.getWindowManager().getDefaultDisplay();int rotation = display.getRotation();//// rotation 的值表示了當前屏幕的旋轉角度,可能的值有:// Surface.ROTATION_0、Surface.ROTATION_90、// Surface.ROTATION_180、Surface.ROTATION_270。//

這樣我們就可以判斷當前屏幕的方向了。

舉個例子,以下方法獲取當前屏幕的旋轉方向,然后將旋轉方向鎖定,使用戶不能再旋轉。

public static void lockScreenOrientation(Activity activity) {  Display display = activity.getWindowManager().getDefaultDisplay();  switch (display.getRotation()) {    case Surface.ROTATION_90:      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);      break;    case Surface.ROTATION_180:      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);      break;    case Surface.ROTATION_270:      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);      break;    default:      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  }}

總結

  1. android:screenOrientation 屬性可以控制 Activity 的方向,常用的值有 unspecified (默認,可旋轉)、 landscape (保持橫屏)、 portrait (保持豎屏)。
  2. 觸發橫豎屏切換時,如果希望 Activity 銷毀并重新創建,則可以設置 Activity 的 android:configChanges="orientation" 。
  3. 觸發橫豎屏切換時,如果不希望 Activity 銷毀并重新創建,可以設置 Activity 的 android:configChanges="keyboardHidden|orientation|screenSize" 。此后橫豎屏切換時,可以在 Activity.onConfigurationChanged 或 View.onConfigurationChanged 方法中處理切換后的事情。
  4. 在任何時候可以用 getResources().getConfiguration().orientation 獲取屏幕的橫豎屏狀態。
  5. 在任何時候可以用 activity.getWindowManager().getDefaultDisplay().getRotation() 獲取屏幕的旋轉角度。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产日韩xxxxx| 国产精品久久久久久久久久久不卡| 68精品国产免费久久久久久婷婷| 91精品国产综合久久久久久蜜臀| xvideos亚洲人网站| 北条麻妃一区二区三区中文字幕| 97在线视频免费看| 久久亚洲精品国产亚洲老地址| 国产91ⅴ在线精品免费观看| 色悠悠久久久久| 国产噜噜噜噜噜久久久久久久久| 岛国精品视频在线播放| 欧美夫妻性生活xx| 91av在线免费观看视频| 亚洲天堂男人天堂女人天堂| 精品国产欧美一区二区三区成人| 久久av资源网站| 久久手机免费视频| 中文字幕亚洲欧美日韩高清| 国产日韩换脸av一区在线观看| 国产91精品久久久久久久| 亚洲欧美日韩高清| 国产精品第1页| 国产精品成人免费视频| 亚洲码在线观看| 精品久久久久久久久久久久| 国产欧美日韩91| 亚洲第一网站男人都懂| 亚洲桃花岛网站| 最近2019中文字幕第三页视频| 欧美丝袜美女中出在线| 日韩欧美高清视频| 亚洲精品电影网在线观看| 欧美性生活大片免费观看网址| 国产精品视频自拍| 91在线精品视频| 91沈先生在线观看| 亚洲精品久久久久久久久| 国产小视频国产精品| 亚洲欧美日韩在线高清直播| 国产亚洲成av人片在线观看桃| 一区二区三区回区在观看免费视频| 亚洲天堂av综合网| 日韩中文字幕在线观看| 国产精品黄色影片导航在线观看| 亚洲日本aⅴ片在线观看香蕉| 成人免费视频在线观看超级碰| 亚洲国产成人精品电影| 成人h片在线播放免费网站| 久久久女人电视剧免费播放下载| 亚洲jizzjizz日本少妇| 久热精品视频在线观看| 成人av色在线观看| 欧美性xxxxx极品娇小| 91午夜在线播放| 奇米成人av国产一区二区三区| 91久热免费在线视频| 91av在线影院| 96pao国产成视频永久免费| 日韩视频亚洲视频| 欧洲成人免费aa| 日韩欧美在线免费观看| 国产午夜精品一区二区三区| 成人激情视频在线播放| 日韩欧美亚洲国产一区| 国产成人福利网站| 亚洲a在线观看| 欧美在线免费视频| 亚洲 日韩 国产第一| 国产精品日韩av| 精品国产一区二区三区在线观看| 久久久久久亚洲精品不卡| 久久久999精品视频| 亚洲码在线观看| 久久国产色av| 欧美激情a在线| 国产精品都在这里| 亚洲级视频在线观看免费1级| 久热精品视频在线观看一区| 91国语精品自产拍在线观看性色| 中文字幕久热精品在线视频| 韩国欧美亚洲国产| 日韩电影免费观看中文字幕| 一本色道久久88综合日韩精品| 国产精品久久久久久久av大片| 国产成人avxxxxx在线看| 国产91免费观看| 亚洲欧美国产精品专区久久| 亚洲自拍偷拍色片视频| 日韩精品电影网| 亚洲自拍偷拍色片视频| 久久69精品久久久久久久电影好| 欧美精品www| 欧美极品第一页| 久久免费精品视频| 久久久久久有精品国产| 日本国产一区二区三区| 国产丝袜高跟一区| 久久久影视精品| 亚洲成人免费网站| 日韩精品一二三四区| 中国china体内裑精亚洲片| 欧美精品在线极品| 欧洲亚洲妇女av| 久久91精品国产91久久跳| 国产精品草莓在线免费观看| 欧美日韩亚洲天堂| 亚洲国产精品高清久久久| 亚洲女同精品视频| 国产精品在线看| 欧美一乱一性一交一视频| 国产亚洲欧美日韩一区二区| 国内精品久久久久影院 日本资源| 亚洲精品98久久久久久中文字幕| 日韩视频在线一区| 国产精品欧美日韩一区二区| 国产99久久精品一区二区 夜夜躁日日躁| 国产精品久久一区主播| 日韩成人xxxx| 成人欧美一区二区三区黑人| 国产日韩精品电影| 亚洲天堂网在线观看| 成人午夜激情网| 日韩综合中文字幕| 一区二区三区无码高清视频| 日韩av网站导航| 欧美日韩精品中文字幕| 日韩av黄色在线观看| 蜜臀久久99精品久久久无需会员| 久久影院中文字幕| 亚洲第一区中文字幕| 国产精品电影久久久久电影网| 日本成人精品在线| 国产精品一区二区久久久久| 日本成人黄色片| 91九色视频在线| 久久久久日韩精品久久久男男| 久久久97精品| 国内精品视频一区| 欧美www在线| 日本久久久久久久久久久| www.国产一区| 在线电影中文日韩| 欧美成人精品不卡视频在线观看| 国产99久久精品一区二区永久免费| 欧美精品精品精品精品免费| 成人a免费视频| 国产精品网红直播| 国产精品高潮粉嫩av| 色综合视频网站| 国产精品尤物福利片在线观看| 亚洲天堂视频在线观看| 国产亚洲欧洲高清一区| 亚洲区一区二区| 欧美精品电影免费在线观看| 欧美日韩成人在线播放| 欧美专区在线播放| 一区二区三区视频在线| 国产成人精品视频在线| 91精品国产综合久久久久久蜜臀| 亚洲国产成人精品久久| 日本精品视频网站| 日韩毛片中文字幕| 中文字幕欧美日韩va免费视频|