[英]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()
每一行上得到一個空指針。 但是,從我的閱讀中, onCreate
, onCreateView
和onActivityCreated
都使用相同的包。 我已經嘗試將代碼移動到其他兩個沒有運氣。
我最終想出了一個相當討厭的工作。 沒有激動,因為它實際上並沒有解決核心問題。 如果有人能幫我找到,我很樂意接受這個答案。
也就是說,我只是使用活動的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.