簡體   English   中英

當方向改變android時保存活動狀態

[英]Save state of activity when orientation changes android

我有一個 aacplayer 應用程序,當方向從縱向變為橫向時,我想保存我的活動狀態。 TextViews 似乎不是空的,我嘗試使用以下方法凍結我的文本視圖:

android:freezesText="true"

我的清單:

android:configChanges="orientation"

我也試過這個:

@Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.main2);

因此,當方向更改為橫向時,我可以看到我的 layout-land main2.xml,這有效,但我的 textview 消失並顯示為空。 流媒體音樂效果很好。 當方向改變時我可以收聽它,但是每次我改變設備的方向時,textviews 中的文本都消失了。

我應該怎么做才能解決這個問題,以便保存狀態?

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
....
....

非常感謝你。

當您的方向發生變化時,您不必手動更改為橫向布局文件。 Android 會自動為您執行此操作。 當方向改變時,Android 會破壞您當前的活動並再次創建一個新活動,這就是您丟失文本的原因。

假設您想要縱向和橫向的單獨布局,您需要做兩部分。

  1. 假設您有 2 個用於縱向和橫向的 XML 布局文件,請將您的 main.xml 布局文件放在以下文件夾中:

    res/layout/main.xml <-- 這將是你的縱向布局
    res/layout-land/main.xml <-- 這將是您的橫向布局

    這就是您需要做的所有事情,您不必觸摸清單文件來修改android:configChanges="orientation"或覆蓋onConfigurationChanged() 實際上,建議您不要為了您要實現的目標而觸摸它。

  2. 現在從文本視圖中保存您的文本 =) 讓我們假設您的文本視圖在布局 xml 文件中被命名為 MyTextView。 您的活動將需要以下內容:

     private TextView mTextView; private static final String KEY_TEXT_VALUE = "textValue"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mTextView = (TextView) findViewById(R.id.main); if (savedInstanceState != null) { CharSequence savedText = savedInstanceState.getCharSequence(KEY_TEXT_VALUE); mTextView.setText(savedText); } } @Override protected void onSaveInstanceState (Bundle outState) { super.onSaveInstanceState(outState); outState.putCharSequence(KEY_TEXT_VALUE, mTextView.getText()); }

基本上,每當 Android 銷毀並重新創建您的 Activity 以更改方向時,它都會在銷毀之前調用onSaveInstanceState()並在重新創建之后調用onCreate() 無論您在 onSaveInstanceState 包中保存什么,都可以從onCreate()參數中獲取。

所以你想在onSaveInstanceState()保存文本視圖的值,然后讀取它並在 onCreate() 中填充你的文本視圖。 如果活動是第一次創建(不是由於輪換更改),則onCreate()的 savedInstanceState 將為空。 你也可能不需要android:freezesText="true"

如果需要,您也可以嘗試保存其他變量,因為當活動被銷毀和重新創建時,您將丟失所有存儲的變量。

static CharSequence savedText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(savedText != null) {
        TextView mTextView = (TextView) findViewById(R.id.main);
        mTextView.setText(savedText);
    }
}

// Another function in activity, when you change text
public void actionButton(View view) {
    // Change and save text in textView
    savedText = "Change text";
    mTextView.setText(savedText);
}

它為我工作。 但我認為它不是很好的代碼風格和 android 架構。

有兩種方法可以做到這一點,第一種是在AndroidManifest.xml文件中。 您可以將此添加到您的活動標簽中

android:configChanges="keyboardHidden|orientation|screenSize|screenLayout"

或者您可以覆蓋兩個處理此問題的方法。 這種方法需要更多的努力,但可以說要好得多。 onSaveInstanceState保存活動被殺死之前的狀態,而onRestoreInstanceStateonStart()之后恢復該信息。 請參閱官方文檔以獲得更深入的了解。

在下面的示例代碼中,我保存了 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 I am restoring those values with `getInt`, then I can pass those stored values into the spinner and radio button group 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);
    }

我在KOTLIN靜態 var / val 中使用:

class MyFragment : Fragment()
{
     //all my code
     //access to static vars -> MyStaticClass.hello
}

class MyStaticClass 
{
    companion object {
        var hello: String = "Static text"
        var number_static: Int = 0
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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