簡體   English   中英

Android片段沒有保存狀態

[英]Android fragment not saving state

我最近將我的應用從基於活動的應用轉換為基於片段的應用。 這是一個得分保持應用程序,我很容易在活動時保存和恢復得分。 但是,這似乎不是一個片段。 這是我的代碼:

 @Override
public void onSaveInstanceState(Bundle savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);

    if(t!=null&&flag==1){
        savedInstanceState.putInt("time", t.getTimeLeft());
    } else {
        savedInstanceState.putInt("time", 0);
    }

    savedInstanceState.putIntArray("score_array", points);
    savedInstanceState.putIntArray("position_array", spinnerPosition);
    savedInstanceState.putBooleanArray("checked_array", shouldBeChecked);

    flag = 0;
    Log.d("MyApp", "savingState");
}

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);

    Log.d("MyApp", "onActivityCreated");

    try {
        int timeLeft = savedInstanceState.getInt("time");

        points = savedInstanceState.getIntArray("score_array").clone();
        spinnerPosition = savedInstanceState.getIntArray("position_array").clone();
        shouldBeChecked = savedInstanceState.getBooleanArray("checked_array").clone();

        ((BaseAdapter) ((ListView)getView().findViewById(R.id.missionList)).getAdapter()).notifyDataSetChanged();

        if(timeLeft!=0){
            flag=1;

            this.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

            t = new TimerClass(timeLeft*1000, 1000);
            t.setViews((TextView)getView().findViewById(R.id.minuteView), (TextView)getView().findViewById(R.id.tenSecondView), (TextView)getView().findViewById(R.id.secondView), (Button)getView().findViewById(R.id.start_button));
            ((Button)getView().findViewById(R.id.start_button)).setText(R.string.stop);
            t.start();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } 

}

我在onRestoreInstanceState的活動上成功使用了這個完全相同的代碼而不是onActivityCreated而沒有使用try / catch。 問題是,當我嘗試從捆綁中提取某些東西時,我得到空指針錯誤。 我可以在日志中看到保存狀態,然后是onActivityCreated,但是onActivityCreated似乎沒有通過onSavedInstanceState獲取放入bundle中的東西。 我只是在調用savedInstanceState.getAnything()每一行上得到一個空指針。 但是,從我的閱讀中, onCreateonCreateViewonActivityCreated都使用相同的包。 我已經嘗試將代碼移動到其他兩個沒有運氣。

我最終想出了一個相當討厭的工作。 沒有激動,因為它實際上並沒有解決核心問題。 如果有人能幫我找到,我很樂意接受這個答案。

也就是說,我只是使用活動的onSaveInstanceState和onRestoreInstanceState來保存和恢復片段數據。

對於需要更好答案的人:

始終在訪問之前測試if(savedInstanceState!=null) ,以避免空指針錯誤。 另外,請注意,當片段被銷毀時, onSaveInstanceState()將無法在所有情況下保存數據。

特別是如果您的片段被推到后堆棧上,並且設備被旋轉。 在這種情況下,只有onDestoryView()在你的Fragment被推到后面的堆棧時被調用,所以當onSaveInstanceState()在設備輪換期間運行時,它將無法保存你的Views中的任何數據,因為它們都是先前被銷毀的。

請參閱以下主題以了解解決方法。 我認為這對每個使用Fragments開發的人都很有用。 尤其是DroidT的回答: https//stackoverflow.com/a/19744402/2517350

暫無
暫無

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

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