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

Mic*_*ith 25 android android-fragments

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

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

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

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

Jor*_*Gil 39

您的成员变量可能不再存在,因为FragmentManager您的Activity所有碎片都在死亡.

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

正如文件所说:

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

UPDATE

在你的Activity onSaveInstanceStateonRestoreInstanceState,尝试保存你的Fragment引用,然后用这样的东西恢复它们:

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

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


Syd*_*ell 6

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

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

对不起是船长显而易见的!