Android:捆绑始终为空

Posted

技术标签:

【中文标题】Android:捆绑始终为空【英文标题】:Android: Bundle always null 【发布时间】:2012-08-10 14:35:57 【问题描述】:

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

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

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

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

    onSaveInstanceState 被调用 onCreate 被调用 --> bundle != null 再次调用 onCreate(为什么?) --> bundle = null 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 为空时执行片段事务,那么它似乎可以工作。但我不确定我以后是否会遇到不同的问题。有人有这方面的背景知识吗?

【问题讨论】:

什么是“onActivityCreated”方法?我从来没有听说过。 仅当您使用片段时,请参阅developer.android.com/guide/components/fragments.html 【参考方案1】:

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

答案是在编辑 2 中用 if(getFragmentManager().findFragmentByTag("overviewFrag") == null) 和 当然要设置标签。


有一个关于同一主题的旧问题,可以在这里找到:Saving Android Activity state using Save Instance State

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

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

小心:您需要致电 super.onSaveInstanceState(savedInstanceState) 在添加您的 Bundle 的值,否则它们将在该调用中被清除(Droid X Android 2.2)。


作为一般建议,始终使用 @Override-annotation 对覆盖的方法进行注释,以获得编译时安全性。欲了解更多信息,请参阅:When do you use Java's @Override annotation and why?


这里有一些更相关的问题可能会有所帮助:

Fragment onCreateView and onActivityCreated called twice(你说的那个) android onCreateOptionsMenu called twice when restoring state(同一个人一天后问,得到了别人的回复) onCreateOptionsMenu is being called too many times in ActionBar using tabs(他提供的链接)

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

【讨论】:

感谢您的回答,但我仍然得到完全相同的行为。 答案是在 Edit 2 中用 if(getFragmentManager().findFragmentByTag("overviewFrag") == null) 包围我的片段事务,当然还要设置标签。

以上是关于Android:捆绑始终为空的主要内容,如果未能解决你的问题,请参考以下文章

位置返回始终为空 - android

Android 位置对象始终为空

Android logcat“应用程序”列始终为空

Android Google 计费客户端 - onSkuDetailsResponse 始终为空列表

Android OnCreate 输入包始终为空

延迟的深层链接在 android 和 facebook SDK 中始终为空