[英]Android : Save application state on screen orientation change
在發布此問題之前,我已經看到以下鏈接
http://www.devx.com/wireless/Article/40792/1954
使用 Save Instance State 保存 Android Activity 狀態
http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html
如果狀態由我的類組成,如何在 Android 中的方向更改期間保存狀態?
我不知道我應該如何覆蓋以下功能:
@Override
public Object onRetainNonConfigurationInstance() {
return someExpensiveObject;
}
在我的應用程序中,當第一個 editext 的數據驗證為 true 時,我的布局有一個 editext 可見,其他 editext 可見。我已將所有其他 editextes 和 textviews 的可見性設置為 false 並在驗證后使它們可見。
因此,在我的活動中,如果屏幕方向發生變化,則所有具有android:visibility="false"
的項目都將不可見。
我也開始知道,當我們的活動屏幕方向改變時,它調用 onStop() 然后調用 onDestroy() 然后通過調用 onCreate() 再次啟動一個新的活動
這就是原因..但我不知道如何解決它..
在這里您可以看到我的應用程序的屏幕截圖:
在此圖像中,所有字段都已加載,而在另一張圖像中,當屏幕方向更改為橫向時,它們都消失了
任何指向教程或代碼片段的鏈接都將是非常可觀的。
當出現進度對話框時,我的應用程序也會崩潰,我嘗試更改屏幕方向。如何處理?
謝謝
好吧,如果您對兩個屏幕都有相同的layout
,則無需這樣做,只需在Activity
節點的manifest
中添加以下行
android:configChanges="keyboardHidden|orientation"
對於 Android 3.2(API 級別 13)及更高版本:
android:configChanges="keyboardHidden|orientation|screenSize"
因為當設備在縱向和橫向之間切換時,“屏幕尺寸”也會發生變化。 這里的文檔: http : //developer.android.com/guide/topics/manifest/activity-element.html
還有另一種可能性,您可以使用 onConfigurationChanged(Configuration newConfig) 保持狀態,因為它甚至在方向更改時也是如此。
當您的活動正在運行時設備配置發生變化時由系統調用。 請注意,只有在您選擇了要使用清單中的 configChanges 屬性處理的配置時,才會調用此方法。 如果發生任何未選擇由該屬性報告的配置更改,則系統將停止並重新啟動活動(以使用新配置啟動)而不是報告它。
在調用此函數時,您的 Resources 對象將被更新以返回與新配置匹配的資源值。
有兩種方法可以做到這一點,第一種是在AndroidManifest.xml
文件中。 您可以將此添加到您的活動標簽中。 本文檔將為您提供深入的解釋,但簡單地說,它使用這些值並告訴活動在這些值之一發生更改時不要重新啟動。
android:configChanges="keyboardHidden|orientation|screenSize|screenLayout"
第二個是:覆蓋onSaveInstanceState
和onRestoreInstanceState
。 這種方法需要更多的努力,但可以說更好。 onSaveInstanceState
在 Activity 被殺死之前保存(由開發人員手動)設置的值,而onRestoreInstanceState
在onStart()
之后恢復該信息。 請參閱官方文檔以獲得更深入的了解。 您不必實現onRestoreInstanceState
,但這將涉及將該代碼粘貼在onCreate()
。
在下面的示例代碼中,我保存了 2 個int
值、微調器的當前位置以及一個單選按鈕。
@Override
public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
spinPosition = options.getSelectedItemPosition();
savedInstanceState.putInt(Constants.KEY, spinPosition);
savedInstanceState.putInt(Constants.KEY_RADIO, radioPosition);
super.onSaveInstanceState(savedInstanceState);
}
// And we restore those values with `getInt`, then we can pass those stored values into the spinner and radio button group, for example, to select the same values that we saved earlier.
@Override
public void onRestoreInstanceState(@NotNull Bundle savedInstanceState) {
spinPosition = savedInstanceState.getInt(Constants.KEY);
radioPosition = savedInstanceState.getInt(Constants.KEY_RADIO);
options.setSelection(spinPosition, true);
type.check(radioPosition);
super.onRestoreInstanceState(savedInstanceState);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.