Android片段没有保存状态

时间:2012-09-16 17:23:54

标签: android android-fragments savestate

我最近将我的应用从基于活动的应用转换为基于片段的应用。这是一个得分保持应用程序,我很容易在活动时保存和恢复得分。但是,这似乎不是一个片段。这是我的代码:

 @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都使用相同的捆绑。我试过把代码移到另外两个没有运气。

2 个答案:

答案 0 :(得分:0)

我最终想出了一个相当讨厌的工作。没有激动,因为它实际上并没有解决核心问题。如果有人能帮我找到,我很乐意接受这个答案。

也就是说,我只是使用活动的onSaveInstanceState和onRestoreInstanceState来保存和恢复片段数据。

答案 1 :(得分:0)

对于需要更好答案的人:

在访问之前始终测试if(savedInstanceState!=null),以避免空指针错误。 此外,请注意 onSaveInstanceState()在片段被销毁时无法在所有情况下保存数据。

特别是如果您的片段被推到后面的堆栈上,并且设备被旋转。在这种情况下,当你的Fragment被推到后面的堆栈上时,只有 onDestoryView()被调用,所以当 onSaveInstanceState()在设备轮换期间运行时,它就不会被激活能够保存您的视图中的任何数据,因为它们都是先前被销毁的。

请参阅以下主题以了解解决方法。我认为它对每个使用Fragments开发的人都很有用。 特别是 DroidT 的回答: https://stackoverflow.com/a/19744402/2517350