Android中怎么實(shí)現(xiàn)橫豎屏處理-創(chuàng)新互聯(lián)

這篇文章給大家介紹Android中怎么實(shí)現(xiàn)橫豎屏處理,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站制作、瓜州網(wǎng)絡(luò)推廣、微信平臺小程序開發(fā)、瓜州網(wǎng)絡(luò)營銷、瓜州企業(yè)策劃、瓜州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供瓜州建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

界面旋轉(zhuǎn)方向的決定因素

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

  • 系統(tǒng)的設(shè)置項,一般可以設(shè)置為只允許豎屏或可旋轉(zhuǎn)切換。

  • 設(shè)備的物理傳感器感應(yīng)到的設(shè)備方向。

  • 不同 App 里的代碼對橫豎屏的設(shè)置。

需要注意的一點(diǎn)是,這三個因素沒有固定的優(yōu)先級。所以即使系統(tǒng)的設(shè)置項中設(shè)置了固定為豎屏,App 里的代碼也可以將界面設(shè)置為橫屏,當(dāng)然影響的范圍僅限于 App 內(nèi)部界面。

代碼中設(shè)置橫豎屏的方法

我們有2種方法設(shè)置橫豎屏:

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

如果在 xml 中設(shè)置,則在初始化界面時就已經(jīng)確定好其方向。而在如果 Java 中設(shè)置,則可以做到根據(jù)不同情況動態(tài)設(shè)置。

設(shè)置橫豎屏?xí)r傳入的值和作用

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

  • unspecified :默認(rèn)值,不做任何指定,由系統(tǒng)來決定顯示方向。這將由上一個 activity 來決定,或者當(dāng) activity 處于棧底時由用戶設(shè)置的方向來決定。

  • landscape : 保持橫屏。

  • portrait : 保持豎屏。

  • user : 用戶當(dāng)前設(shè)置的 orientation 值。

  • behide : 保持和上一個 Activity 的方向一致。

  • sensor : 完全根據(jù)物理傳感器的方向來決定。注意用這個值時會忽略用戶在系統(tǒng)設(shè)置中的旋轉(zhuǎn)開關(guān)狀態(tài)。(注意一般機(jī)器即使用這個值也不會支持豎屏旋轉(zhuǎn)180度)

  • nosensor : 忽略物理傳感器的方向。這將導(dǎo)致用戶旋轉(zhuǎn)手機(jī)時不會切換橫豎屏。

  • sensorLandscape : 保持橫屏,但可以根據(jù)物理傳感器來決定橫屏的方向。

  • sensorPortrait : 保持豎屏,但可以根據(jù)物理傳感器來決定豎屏的方向。

  • reverseLandscape : 保持橫屏,但方向與使用 landscape 時相反。

  • reversePortrait : 保持豎屏,但方向與使用 portrait 時相反。

  • fullSensor : 與 sensor 大致相同,區(qū)別在于這個屬性會允許4個方向都可以旋轉(zhuǎn)。

  • userLandscape : 保持橫屏,但可以在用戶允許旋轉(zhuǎn)的情況下,根據(jù)物理傳感器來決定橫屏的方向。(注意與 sensorLandscape 對比)

  • userPortrait : 保持豎屏,但可以在用戶允許旋轉(zhuǎn)的情況下,根據(jù)物理傳感器來決定豎屏的方向。(注意與 sensorPortrait 對比)

  • fullUser : 與 user 大致相同,區(qū)別在于如果用戶允許旋轉(zhuǎn),這個屬性允許4個方向都可以旋轉(zhuǎn)。

  • locked : 屏幕方向會鎖定在當(dāng)前方向,不能再旋轉(zhuǎn)。

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

橫豎屏切換時引起的 Activity 重新創(chuàng)建

默認(rèn)情況下,橫豎屏切換會引起當(dāng)前 Activity 銷毀然后重新創(chuàng)建。所以我們可以在 Activity 重新創(chuàng)建時根據(jù)當(dāng)前橫豎屏狀態(tài)做一些差異化。最常見的就是根據(jù)橫豎屏采用不同的 layout xml。

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

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

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

@Override
protected 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) {
    // 針對豎屏做一些處理
  }
}

有一個點(diǎn)需要注意,關(guān)于 Activity 的生命周期被重新調(diào)用,有的資料說:

當(dāng)不設(shè)置 Activity 的 android:configChanges 屬性時,切到橫屏?xí)r會重新執(zhí)行一次生命周期,而切到豎屏?xí)r會執(zhí)行兩次。

如果設(shè)置了 android:configChanges="orientation" 屬性,則都只會執(zhí)行一次。

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

阻止橫豎屏切換時 Activity 重啟

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

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

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

android:configChanges="orientation|keyboardHidden"

而 Android 3.2 以后的 SDK 則需要設(shè)置為

android:configChanges="keyboardHidden|orientation|screenSize"

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

橫豎屏切換時的回調(diào)

一旦我們按照上述方法設(shè)置了 android:configChanges 屬性,那么橫豎屏切換時 Activity 將不會重新創(chuàng)建,那么當(dāng)屏幕旋轉(zhuǎn)時,我們在代碼上怎么感知呢?可以通過 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){ 
    // 針對豎屏做一些處理
  } 
}

判斷當(dāng)前屏幕方向

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

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

這樣我們就可以判斷當(dāng)前屏幕的方向了。

舉個例子,以下方法獲取當(dāng)前屏幕的旋轉(zhuǎn)方向,然后將旋轉(zhuǎn)方向鎖定,使用戶不能再旋轉(zhuǎn)。

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);
  }
}

關(guān)于Android中怎么實(shí)現(xiàn)橫豎屏處理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

文章題目:Android中怎么實(shí)現(xiàn)橫豎屏處理-創(chuàng)新互聯(lián)
文章來源:http://muchs.cn/article16/deicgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)動態(tài)網(wǎng)站、小程序開發(fā)電子商務(wù)、App設(shè)計、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)