从后退堆栈检索后,片段参数不包含任何数据

Fragment arguments contains NO data after retrieving from backstack

提问人:Ionut Ciuta 提问时间:9/11/2015 最后编辑:Ionut Ciuta 更新时间:9/11/2015 访问量:1094

问:

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

我在 A 的 onCreate 方法中检索 O,并在 onViewCreated 中使用 O 设置字段。在这里之前,一切都很好。将 A 替换为另一个片段(片段 B)并从 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 也使用上述方法显示。

我做错了什么?

安卓 android-fragments fragment-backstack

评论

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

答:

1赞 Oleh Toder 9/11/2015 #1

通知方法。 当您首次创建 Fragment from 方法时,此传递的 Bundle 将为 null。你只需从方法中提取你的 O 对象,就像你所做的那样。
为了保存您的对象以备将来使用,请覆盖并保存您的 O 对象(可能如下所示)
Fragment#onCreate(Bundle savedInstanceState)A#getInstanceFragment#getArgumentsFragment#onSaveInstanceState

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#onCreateBundle

@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

    }
}

评论

0赞 Ionut Ciuta 9/14/2015
我很欣赏你的回答,但是,当我替换片段时,不会调用 onSaveInstanceState。所以,当我导航回来时,我遇到了同样的问题。替换当前 Fragment 时,最后一个生命周期回调是 onStop,在此之前从不调用 onSaveInstanceState。所以是的......