Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 屏幕旋轉適配全解析

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()

再次運行看看效果

這裡寫圖片描述vcbBxLu9+NDQ0P3XqqOsQWN0aXZpdHm9+NDQz/q72dbYvai688r9vt3SwMi7tObU2jwvcD4NCjxwPtfuuvPU2b3pydy49re9t6ijrMrWtq/Iw0FjdGl2aXR5vfjQ0ND916o8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> //設置Activity橫屏顯示 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //設置Activity豎屏顯示 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved