Android:Bundle总是为null

时间:2012-08-14 10:05:02

标签: android android-fragments android-lifecycle

我有一个片段和屏幕旋转我想保存一些我有的状态

@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中看到了这个:

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

编辑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时才执行片段事务,那么它似乎有效。但我不确定以后是否会遇到另一个问题。有人对此有一些背景知识吗?

1 个答案:

答案 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。