我有一个片段和屏幕旋转我想保存一些我有的状态
@Override
public void onSaveInstanceState(Bundle bundle)
{
super.onSaveInstanceState(bundle);
bundle.putSerializable("myList", myList);
bundle.putString("test", "test");
}
保存我需要的数据,我可以在调试器中看到代码至少被调用然后获取我拥有的数据
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
if(savedInstanceState != null)
{
//do something
}
else
{
//do something else
}
}
但是在这里,我总是以我的if语句结束其他方式。我不知道为什么它是null。感谢。
修改 根据第一个答案加上代码更改了代码:
当旋转屏幕时,我在debuger中看到了这个:
- onSaveInstanceState被称为
- onCreate被称为 - > bundle!= null
再次调用- onCreate(为什么?) - > bundle = null
- onCreateActivity被调用 - > bundle = null
醇>
编辑2 我找到了关于标签的simlar帖子,它们分离了,这就是它被调用两次的原因。我不得不承认我还没有完全理解这些帖子......但它可能与此有关。在我的活动中,我有以下代码
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
OverviewFragment of = new OverviewFragment();
FragmentTransaction tof = getFragmentManager().beginTransaction();
tof.replace(R.id.frag_overview, of);
DetailFragmentInitial df = new DetailFragmentInitial();
tof.replace(R.id.frag_details, df);
tof.commit();
}
并且可能不得不以某种方式改变...但我不确定...如果我只在savedInstaceState为null时才执行片段事务,那么它似乎有效。但我不确定以后是否会遇到另一个问题。有人对此有一些背景知识吗?
答案 0 :(得分:3)
为了更好的可见性,这里是 @AndyAndroid 的工作解决方案(如他的评论中所述):
答案是在编辑2中包含我的片段事务
if(getFragmentManager().findFragmentByTag("overviewFrag") == null)
和 当然设置标签。
关于同一主题有一个较旧的问题,可在此处找到:Saving Android Activity state using Save Instance State
为了概述代码(在接受的答案中)和你的代码之间的差异,该示例在之前调用超级方法将它自己的值放入包中。
来自 @jkschneider 的评论概述了这一点:
小心:你需要打电话 super.onSaveInstanceState(savedInstanceState)在添加之前 Bundle的值,或者它们将在该调用中消失(Droid X. Android 2.2)。
作为一般建议,始终使用@Override
- 注释来注释覆盖方法,以获得编译时安全性。有关详细信息,请参阅:When do you use Java's @Override annotation and why?
以下是一些可能有帮助的相关问题:
检查上一个答案中给出的代码是否适合您,因为它似乎是针对其他两个问题的OP。