【问题标题】:Fragment arguments contains NO data after retrieving from backstack从后台堆栈检索后,片段参数不包含任何数据
【发布时间】:2015-09-11 07:34:48
【问题描述】:

所以,我有一个片段 - 片段 A - 包含一个对象 - 对象 O - 用于设置 TextViews 和其他元素。为了实例化片段,我使用了一个静态方法 A.getInstance(O)。对象 O 是可序列化的,因此我可以使用 instance.setArguments 等通过 Bundle 将其发送到片段 A 的新实例。

我在 A 的 onCreate 方法中检索 O,并在 onViewCreated 中使用 O 设置字段。直到这里一切正常。在我用另一个片段(片段 B)替换 A 并从 B 导航回 A 后,参数 Bundle 不再包含对象 O,我得到 NullPointerException。 Bundle本身不为null,但不包含O。

我用这个方法替换片段:

public void replaceCurrentFragment(Fragment fragment) {
        FragmentTransaction fragmentTransaction = context.getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.frame, fragment).addToBackStack(null).commit();
}

片段A也使用上述方法显示。

我做错了什么?

【问题讨论】:

  • 您是否仅从 Fragment#getArgumnets() 恢复对象 O?您是否尝试从 Fragment 实例状态保存和恢复对象 O?
  • 我在 onCreate 期间将对象 O 保存在片段 A 的实例中。问题是我第二次进入 onCreate 时没有得到 O。
  • 我的意思是,你是否重写了 Fragment#onSaveInstanceState 来保存你的对象,然后在 Bundle 中查找它,传入 onCreate(Bundle savedInstanceState)?
  • 不,我没有那样做。有必要吗?我目前正在使用 Fragment#getArguments() 检索捆绑包。它不应该每次都返回相同的Bundle吗?

标签: android android-fragments fragment-backstack


【解决方案1】:

注意Fragment#onCreate(Bundle savedInstanceState) 方法。 当您第一次从 A#getInstance 方法创建 Fragment 时,此传递的 Bundle 将为空。您将像您一样从 Fragment#getArguments 方法中提取您的 O 对象。
为了保存您的对象以供将来使用,请覆盖 Fragment#onSaveInstanceState 并将您的 O 对象保存在那里(可能如下所示)

private static final String EXTRA_MY_OBJECT = "com.example.extra_my_object";

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable(EXTRA_MY_OBJECT, mMyObject);
}

然后在Fragment#onCreate 中,您可以从传递的Bundle 中获取您的对象 就这样:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        mMyObject = savedInstanceState.getSerializable(EXTRA_MY_OBJECT);
    }
    if (mMyObject == null) {
        //fragment was created for first time probably, or something went wrong
        //try to get your object from getArguments

    }
}

【讨论】:

  • 感谢您的回答,但是,当我替换片段时不会调用 onSaveInstanceState 。所以,当我返回时,我面临同样的问题。当当前片段被替换时,最后一个生命周期回调是 onStop 并且在此之前永远不会调用 onSaveInstanceState。嗯是的。 . .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
相关资源
最近更新 更多