0

所以,我有一个片段 - 片段 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 也使用上述方法显示。

我究竟做错了什么?

4

1 回答 1

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

    }
}
于 2015-09-11T08:07:55.960 回答