Android 屏幕旋轉相關解析

qiaosu2012 8年前發布 | 10K 次閱讀 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屏幕旋轉的適配和常用操作技巧就介紹完了,歡迎大家在下面留言。

[本篇源碼下載]
(http://download.csdn.net/detail/leejizhou/9500995)

來自: http://blog.csdn.net/leejizhou/article/details/51233342

 本文由用戶 qiaosu2012 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!