1. 程式人生 > >Android橫豎屏切換你必須知道的事

Android橫豎屏切換你必須知道的事

       平常我們遇到的橫豎屏切換最大的問題就是,螢幕切換後,原來介面中的東西會被清空,也就是Activity被重新建立。那麼這時候就需要你做一些設定了,最簡單的就是在AndroidMainfest.xml中設定activity中的android:screenOrientation屬性值來實現。

(一)簡單瞭解橫豎屏的屬性

既然通過屬性進行控制橫豎屏,那麼我們就先來講講有哪些屬性,分別代表什麼意思。(其實也是為了自己以後方便查閱)

"unspecified":預設值 由系統來判斷顯示方向。這個和裝置有關,不同裝置會有不同的顯示方向。

"landscape":橫屏顯示。

"portrait":豎屏顯示。

"user":使用者當前首選的方向。

"behind":和該Activity下面的那個Activity的方向一致(在Activity堆疊中的)。

"sensor":由物理的感應器來決定。如果使用者旋轉裝置,這時螢幕會橫豎屏切換。

"nosensor":忽略物理感應器,這樣就不會隨者使用者旋轉裝置而橫豎屏切換了。

比如進行了以下設定:

android:screenOrientation="portrait"

則無論手機如何旋轉,擁有這個屬性的activity都始終豎屏顯示。

android:screenOrientation="landscape"

則無論手機如何旋轉,擁有這個屬性的activity都始終橫屏顯示。

當然你也可以在程式碼中進行橫豎屏的設定:

設定為豎屏

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

設定為橫屏 

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

(二)如何阻止Activity被重建

下面就是我們最關心的,如何防止螢幕橫豎屏切換而導致的Activty被重建。即當前介面中的資料不會因為螢幕的切換而消失。其實Android已經為我們提供瞭解決方案,就是通過onConfigrationChanged攔截橫豎屏變換,從而進行必要的重新佈局和切換操作。

首選,在AndroidManifest.xml檔案中為相應的Activity設定android:configChanges屬性,從而讓Activity避免重建流程。

Android3.2以前的SDK可以使用如下配置:

android:configChanges="orientation|keyboardHidden"

Android3.2以後的SDK必須在原來基礎上新增screenSize屬性: 

android:configChanges="orientation|keyboardHidden|screenSize"

onConfigurationChanged()方法

在Activity中可以重寫這個方法,當螢幕方向發生改變時的回撥方法

    /**
     * 系統配置發生改變時回撥的方法
     * 包括系統語言、橫豎屏切換、字型大小、鍵盤等
     * */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged: "+newConfig.orientation);
    }

當然這個方法被呼叫的前提是,已經在AndroidManifest.xml檔案中設定了configChanges屬性“orientation”。需要注意的是,onConfigurationChanged函式中只能獲得橫豎屏切換後的引數。順便說以下,這個方法其實在很多時候都會被回撥,比如:切換系統語言、切換字型大小、接入鍵盤等。

(三)效果展示

(四)對於setRequestedOrientation函式的用法說明

      手動呼叫setRequestedOrientation之後,假如會引發橫豎屏切換(即請求得橫豎屏要求與當前得橫豎屏狀態不一致),那麼會立即呼叫onConfigurationchanged函式;假如不會引發橫豎屏切換(請求前後一致),那麼就不會呼叫onConfigurationchanged函式。

       onConfigurationchanged函式得呼叫可以在Activity得任何地方,即也可以在它自身中呼叫,但是一旦通過這種設定完成橫豎屏切換之後,那麼後面不論螢幕如何翻轉變化,都不會再觸發橫豎屏切換了,也就是等同於再AndroidManifest.xml中設定了android:screenOrientation屬性為橫屏或者豎屏。如要回復,則必須重新呼叫setRequestedOrientation方法。