簡體   English   中英

Android:在屏幕方向更改時保存應用程序狀態

[英]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"

第二個是:覆蓋onSaveInstanceStateonRestoreInstanceState 這種方法需要更多的努力,但可以說更好。 onSaveInstanceState在 Activity 被殺死之前保存(由開發人員手動)設置的值,而onRestoreInstanceStateonStart()之后恢復該信息。 請參閱官方文檔以獲得更深入的了解。 您不必實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM