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 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
我要留言
留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。