我正在尝试使用android中的viewpager和新标签设计(new is 11+)。我在示例中看到,setArgument / getArguments用于将信息传递给Fragment。
我想传递一个对象(大小合适的对象)。我在想,为什么不拨打一个setter来避免序列化呢?
例如
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new DummySectionFragment();
fragment.setMyCustomInfo(myObject); // method I created to set info
return fragment;
}
而不是:
公共类SectionsPagerAdapter扩展了FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new DummySectionFragment();
fagment.setMyCustomInfo(myObject);
args.putSerializable("Serial", myObject);
fragment.setArguments(args);
return fragment;
}
答案 0 :(得分:0)
Fragment参数中的大对象迟早会失败,因为在intent中有一定的最大大小(我认为它大约是1 mB)。
所有难以包裹/序列化或非常大的东西(例如拿着图像的东西)都应该通过setter来设置。您必须注意在适当的时间设置数据。碎片寻呼机特别棘手。
答案 1 :(得分:0)
为什么不拨打一个setter来避免序列化呢?
正如我在评论中所说,使用setter,你需要手动调用它来在Fragment
恢复时传递数据(这是一个参数为{{的构造函数的情况) 1}}当系统自动恢复Fragment
(这将调用无参数构造函数)时,在某些情况下不会调用它。通过使用Fragment
,您可以免费获得此功能,并避免潜在的问题。
另一种解决方法是让setArguments()
直接从Fragment
检索数据(不会调用任何setter)。因为您在Activity
调用中使用片段,所以设置器将要求您首先找到片段,这可能容易出错。如果ViewPager
自行检索数据,您将在适当的时间仅更新正确的片段。