1. 程式人生 > >Android 螢幕旋轉相關解析

Android 螢幕旋轉相關解析

這篇博文給大家介紹下,當手機螢幕旋轉時我們應當怎麼去處理,首先了解下預設情況下Android進行螢幕旋轉的原理,當手機進行旋轉時重力感應sensor起到作用,會將Activity銷燬並按照橫屏的螢幕尺寸進行重新構造,生命週期如下圖所示,一句話總結就是預設情況下Activity進行螢幕旋轉會自動進行onDestroy並重新onCreate。

這裡寫圖片描述

*onSaveInstanceState和onRestoreInstanceState用處後面會介紹到。

先介紹2種非預設情況下的操作

1:禁止螢幕旋轉

在AndroidManifest.xml的Activity中配置

始終豎屏

android:
screenOrientation="portrait"

始終橫屏

android:screenOrientation="landscape"

2:Activity跟隨旋轉但不銷燬和重啟

這個實現原理是告訴系統這個Activity的旋轉處理由我們自己去處理,不用幫我銷燬和重啟

在AndroidManifest.xml的Activity中配置

android:configChanges="keyboardHidden|orientation|screenSize"

然後在Activity中進行方法複寫,監聽螢幕旋轉並處理

    @Override
    public
void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Toast.makeText(MainActivity.this, "豎屏模式", 3000).show(); } else { Toast.makeText(MainActivity.this
, "橫屏模式", 3000).show(); } }

接下來介紹,Activity進行預設旋轉時候的處理,當螢幕進行旋轉的時候會按照橫屏的解析度進行重繪,當然你也可以不進行任何處理難看就難看唄:),理想狀態的處理就是建立兩套同名的Layout,當螢幕旋轉時系統會自動幫我們載入橫屏的Layout。

首先在工程res目錄下新建一個layout-land 這個目錄下是專門為橫屏Layout準備的

這裡寫圖片描述

然後建立一個同名不同樣的佈局檔案就Ok了,我在豎屏的Layout建立了上下的Button在橫屏的Layout建立了橫排並列的Button
看一下執行效果

這裡寫圖片描述

可以看到系統已經幫我們自動在橫豎屏轉換的時候切換了Layout,這樣就實現了橫豎屏的基本適配,但是這樣簡單的處理會出現問題,什麼問題呢?當我們點選第一個Button為TextView設定字串後再旋轉螢幕看看會發生什麼?

這裡寫圖片描述

執行後可以看到,我們已經為TextView設定了值但是螢幕旋轉後值卻不見了,這是因為之前說過的螢幕旋轉後系統自動幫我們銷燬了Activity所以之前設定的東西就不見了,這個怎麼去解決呢?這就要靠Android系統給我們提供的onSaveInstanceState和onRestoreInstanceState來進行資料的儲存和恢復,onSaveInstanceState會在onDestroy之前被呼叫,我們可以利用它來進行一些資料的儲存,這裡我們儲存TextView設定的值。

//儲存Activity資料
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("textview", mTextView.getText().toString());
        super.onSaveInstanceState(outState);
    }

然後我們在重啟Activity後如何得到之前儲存的資料呢?這裡有兩種方法

1:在onCreate中

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView=(TextView)findViewById(R.id.textView);
        //恢復資料
        if (savedInstanceState != null) {
            // Restore value of members from saved state
            mTextView.setText(savedInstanceState.getString("textview"));
        }

    }

可以看到,onCreate的萬年不用的Bundle物件終於讓我們用上了。

2:第二種方法是複寫onRestoreInstanceState方法


      @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mTextView.setText(savedInstanceState.getString("textview"));
    }

這裡不需要判斷Bundle物件是否為空,因為系統僅僅會在存在需要恢復的狀態資訊時才會呼叫 onRestoreInstanceState()

再次執行看看效果

這裡寫圖片描述

可以看到螢幕進行旋轉,Activity進行銷燬重建後資料依然存在

最後再介紹個方法,手動讓Activity進行旋轉

//設定Activity橫屏顯示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//設定Activity豎屏顯示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

到此一些關於Android螢幕旋轉的適配和常用操作技巧就介紹完了,歡迎大家在下面留言。