禁止旋轉螢幕時重新載入畫面 (Don't reload, when rotate device)

Screen rotation

Activity在執行時,可以直向或橫向顯示,當旋轉螢幕時,系統會自動做翻轉的動作。這在沒有載入資料的Activity中是沒問題的,但若有些資料是從網路下載下來,當旋轉螢幕時,會全部重新執行一次,因為Android對旋轉的做法是,把原先的Activity給Destroy掉,然後再Create一個新的不同方向的Activity。
如果不想讓 Activity 在旋轉螢幕時被自動轉向,可以在 AndroidManifest.xml 中設定 Activity 的屬性:
  • android:screenOrientation="portrait" (指定為直向)
  • android:configChanges="keyboard|keyboardHidden|orientation" (告訴系統,我要自己處理轉向問題)
<activity
            android:label="@string/app_name"
            android:name=".RotationDeviceDemoActivity" 
            android:configChanges="keyboard|keyboardHidden|orientation" 
            android:screenOrientation="portrait">
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
原本我以為只要指定 configChanges="orientation" 來處理轉向就好,但不能單只有這個,還必須加上 keyboard 及 keyboardHidden 這兩個當螢幕鍵盤出現的時候也要處理,才能正常執行。

如此你可以在 Activity 的 onConfigurationChanged 方法中自己處理螢幕旋時要如何處理。以下會做兩個測試,一個是有鎖定螢幕方向,一個沒有。

測試的程式碼:
public class RotationDeviceDemoActivity extends Activity {

    private final String TAG = "==DEMO==";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onRestoreInstanceState");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState");
    }
}
測試1:當Activity沒有設定configChanges及screenOrientation時(無鎖定螢幕方向)
執行結果:
523: D/==DEMO==(227): onCreate <===第一次開啟Activity
823: D/==DEMO==(227): onSaveInstanceState <===旋轉螢幕時可讓你儲存狀態
823: D/==DEMO==(227): onDestroy <===接著銷毀Activity
883: D/==DEMO==(227): onCreate <===然後從新建立一個新的已轉向的Activity
883: D/==DEMO==(227): onRestoreInstanceState <===並且可讓你取回剛才存下來的狀態

測試2:有設定configChanges及screenOrientation(鎖定螢幕方向)
執行結果:
184: D/==DEMO==(324): onCreate <===第一次開啟Activity
074: D/==DEMO==(324): onConfigurationChanged <===旋轉螢幕
554: D/==DEMO==(324): onConfigurationChanged <===再轉一次

你會發現,Activity 這時不會儲存狀態及銷毀,它只會執行 onConfigurationChanged,不管你轉幾次方向,都只會觸發這方法。你可以自行在這裡指定不同的 layout 佈局,或什麼都不做。
本文網址:https://blog.tonycube.com/2011/10/dont-reload-when-rotate-device.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。