我有片段,我保留在FragmentManager的后台。保存每个片段状态以使用成员变量进行方向更改,例如:
@Override
public void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putLong("userId", mUserId);
outState.putString("username", mUsername);
}
我的问题是,如果有方向更改,因为backstack中的每个片段都是通过onSaveInstanceState调用的,所以我得到一个空指针异常,因为成员变量不再存在。
关于如何解决这个问题的任何想法?
答案 0 :(得分:37)
您的成员变量可能不再存在,因为FragmentManager
中的Activity
与您的所有碎片一起死亡。
您还需要覆盖onSaveInstanceState
类的方法Activity
,因为在保存Activity
状态之前需要保存Fragments
状态。
正如documentation所说:
在很多情况下,片段可能会被大部分拆除(例如放置在没有显示UI的后台堆栈上),但是在其拥有的活动实际需要保存其状态之前,其状态将不会被保存。
<强>更新强>
在Activity
onSaveInstanceState
和onRestoreInstanceState
中,尝试保存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回答 请注意以下事项:
抱歉明显是队长!
答案 2 :(得分:0)
在片段上设置setRetainInstance是否有帮助。 试试
答案 3 :(得分:0)
我认为正确的解决方案是从savedInstanceState
中的onCreate
中读取这些成员变量,这些变量似乎始终在onSaveInstanceState
之前调用。如果您处理onViewCreated
中的字段,则他们没有机会在下一个onSaveInstanceState
之前进行初始化(在此特殊情况下,当Fragment位于Backstack中时)。