27

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

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

我的问题是,如果方向发生变化,由于后台堆栈中的每个片段都通过 onSaveInstanceState 调用,我得到一个空指针异常,因为成员变量不再存在。

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

4

4 回答 4

44

您的成员变量可能不再存在,因为FragmentManagerActivity的所有片段都在消亡。

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

正如文档所说:

在很多情况下,一个片段可能大部分被拆除(例如当放置在没有显示 UI 的后台堆栈上时),但它的状态不会被保存,直到它拥有的 Activity 实际需要保存它的状态。

更新

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

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

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

于 2013-04-09T23:00:05.533 回答
7

以 Jorge Gil 为基础 - 'xɔɾ.xɛ xil answer 注意以下几点:

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

对不起,很明显是队长!

于 2015-08-19T19:57:31.900 回答
1

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

于 2014-11-16T17:26:21.617 回答
0

我认为正确的解决方案是读取那些似乎总是savedInstanceStateonCreate之前被调用的成员变量onSaveInstanceState。如果您处理 中的字段onViewCreated,则它们没有机会在下一个之前初始化onSaveInstanceState(在这种特殊情况下,当 Fragment 在后台堆栈中时)。

于 2017-01-25T13:57:00.033 回答