1

我有一个片段,对于屏幕旋转,我想保存一些我拥有的状态

@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 语句的 else-brach 结尾。我不知道为什么它是空的。谢谢。

编辑 根据第一个答案更改了代码加上:

旋转屏幕时,我在调试器中看到:

  1. onSaveInstanceState 被调用
  2. onCreate 被调用 --> bundle != null
  3. 再次调用 onCreate(为什么?)--> bundle = null
  4. onCreateActivity 被调用 --> bundle = null

编辑 2 我发现了关于标签的类似帖子,它们在哪里分离,这就是为什么它被调用两次。我不得不承认我还没有完全理解这些帖子......但它可能与此有关。在我的活动中,我有以下代码

@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 为空时执行片段事务,那么它似乎可以工作。但我不确定我以后是否会遇到不同的问题。有人对此有一些背景知识吗?

4

1 回答 1

3

为了更好地了解,这里是@AndyAndroid的工作解决方案(如他的评论中所述):

答案是在编辑 2 中使用 if(getFragmentManager().findFragmentByTag("overviewFrag") == null)并且当然设置标签来包围我的片段事务。


关于同一主题有一个较旧的问题,可以在此处找到:使用 Save Instance State 保存 Android Activity 状态

为了概述代码(在接受的答案中)与您的代码之间的区别,该示例在将其自己的值放入包之前调用超级方法。

@jkschneider的评论概述了这一点:

小心:您需要在将值添加到 Bundle 之前调用 super.onSaveInstanceState(savedInstanceState) ,否则它们将在该调用中被清除(Droid X And​​roid 2.2)。


作为一般建议,始终使用@Override-annotation 注释覆盖的方法,以获得编译时安全性。有关更多信息,请参阅:何时使用 Java 的 @Override 注释以及为什么?


以下是一些更相关的问题,可能会有所帮助:

检查最后一个答案中给出的代码是否适合您,因为它似乎适用于其他两个问题的 OP。

于 2012-08-14T10:30:47.473 回答