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:捆绑始终为空的主要内容,如果未能解决你的问题,请参考以下文章