在backstack中使用带有片段的onSaveInstanceState?

时间:2013-03-25 06:12:25

标签: android android-fragments

我有片段,我保留在FragmentManager的后台。保存每个片段状态以使用成员变量进行方向更改,例如:

@Override
public void onSaveInstanceState(Bundle outState) 
{
    super.onSaveInstanceState(outState);
    outState.putLong("userId", mUserId);
    outState.putString("username", mUsername);
}

我的问题是,如果有方向更改,因为backstack中的每个片段都是通过onSaveInstanceState调用的,所以我得到一个空指针异常,因为成员变量不再存在。

关于如何解决这个问题的任何想法?

4 个答案:

答案 0 :(得分:37)

您的成员变量可能不再存在,因为FragmentManager中的Activity与您的所有碎片一起死亡。

您还需要覆盖onSaveInstanceState类的方法Activity,因为在保存Activity状态之前需要保存Fragments状态。

正如documentation所说:

  

在很多情况下,片段可能会被大部分拆除(例如放置在没有显示UI的后台堆栈上),但是在其拥有的活动实际需要保存其状态之前,其状态将不会被保存。

<强>更新

Activity onSaveInstanceStateonRestoreInstanceState中,尝试保存Fragment引用,然后使用以下内容恢复它们:

public void onSaveInstanceState(Bundle outState){
    getFragmentManager().putFragment(outState,"myfragment",myfragment);
}
public void onRestoreInstanceState(Bundle inState){
    myFragment = getFragmentManager().getFragment(inState,"myfragment");
}

告诉我,如果你运气好的话! : - )

答案 1 :(得分:6)

以Jorge Gil为基础 - 'xɔɾ.xɛxil回答 请注意以下事项:

  • 不要忘记调用onSaveInstanceState()的超级实现 和onRestoreInstanceState()。
  • 如果您使用的是支持包:请使用getSupportFragmentManager()而不是getFragmentManager()。
  • 检索原始片段时,必须进行投射。

抱歉明显是队长!

答案 2 :(得分:0)

在片段上设置setRetainInstance是否有帮助。 试试

答案 3 :(得分:0)

我认为正确的解决方案是从savedInstanceState中的onCreate中读取这些成员变量,这些变量似乎始终在onSaveInstanceState之前调用。如果您处理onViewCreated中的字段,则他们没有机会在下一个onSaveInstanceState之前进行初始化(在此特殊情况下,当Fragment位于Backstack中时)。