如果不想讓Activity在旋轉螢幕時被自動轉向,可以在AndroidManifest.xml中設定Activity的屬性:
- android:screenOrientation="portrait" (指定為直向)
- android:configChanges="keyboard|keyboardHidden|orientation" (告訴系統,我要自己處理轉向問題)
android:screenOrientation="portrait">android:configChanges="keyboard|keyboardHidden|orientation"
原本我以為只要指定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佈局,或什麼都不做。
沒有留言:
張貼留言