gpt4 book ai didi

Android fragment 不保存状态

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:38 25 4
gpt4 key购买 nike

我最近将我的应用程序从基于 Activity 的应用程序转换为基于 fragment 的应用程序。这是一个记分应用程序,当它是一项 Activity 时,我可以轻松地保存和恢复分数。但是,这似乎并不能作为一个 fragment 。这是我的代码:

 @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 中的 Activity 中成功地使用了完全相同的代码,并且没有使用 try/catch。问题是我尝试从包中提取一些东西时遇到空指针错误。我可以在日志中看到保存状态,然后是 onActivityCreated,但是 onActivityCreated 似乎没有得到 onSavedInstanceState 放入包中的东西。我只是在调用 savedInstanceState.getAnything() 的每一行上得到一个空指针。然而,根据我的阅读,onCreateonCreateViewonActivityCreated 都使用相同的包。我曾尝试将代码移至其他两个,但没有成功。

最佳答案

对于任何需要更好答案的人:

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

特别是如果您的 Fragment 被插入返回堆栈,并且设备被旋转。在这种情况下,只有 onDestoryView() 会在您的 Fragment 被插入返回堆栈时被调用,因此当 onSaveInstanceState() 在设备旋转期间运行时,它将无法保存 View 中的任何数据,因为它们之前都被销毁了。

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

关于Android fragment 不保存状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com