提问人:Ionut Ciuta 提问时间:9/11/2015 最后编辑:Ionut Ciuta 更新时间:9/11/2015 访问量:1094
从后退堆栈检索后,片段参数不包含任何数据
Fragment arguments contains NO data after retrieving from backstack
问:
因此,我有一个片段 - 片段 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 也使用上述方法显示。
我做错了什么?
答:
1赞
Oleh Toder
9/11/2015
#1
通知方法。
当您首次创建 Fragment from 方法时,此传递的 Bundle 将为 null。你只需从方法中提取你的 O 对象,就像你所做的那样。
为了保存您的对象以备将来使用,请覆盖并保存您的 O 对象(可能如下所示)Fragment#onCreate(Bundle savedInstanceState)
A#getInstance
Fragment#getArguments
Fragment#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#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
}
}
评论
0赞
Ionut Ciuta
9/14/2015
我很欣赏你的回答,但是,当我替换片段时,不会调用 onSaveInstanceState。所以,当我导航回来时,我遇到了同样的问题。替换当前 Fragment 时,最后一个生命周期回调是 onStop,在此之前从不调用 onSaveInstanceState。所以是的......
评论
Fragment#getArgumnets()