在TAB中使用setArguments或fragment方法

时间:2014-03-01 19:27:47

标签: android android-fragments

我正在尝试使用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;
        }

2 个答案:

答案 0 :(得分:0)

Fragment参数中的大对象迟早会失败,因为在intent中有一定的最大大小(我认为它大约是1 mB)。

所有难以包裹/序列化或非常大的东西(例如拿着图像的东西)都应该通过setter来设置。您必须注意在适当的时间设置数据。碎片寻呼机特别棘手。

答案 1 :(得分:0)

  

为什么不拨打一个setter来避免序列化呢?

正如我在评论中所说,使用setter,你需要手动调用它来在Fragment恢复时传递数据(这是一个参数为{{的构造函数的情况) 1}}当系统自动恢复Fragment(这将调用无参数构造函数)时,在某些情况下不会调用它。通过使用Fragment,您可以免费获得此功能,并避免潜在的问题。

另一种解决方法是让setArguments()直接从Fragment检索数据(不会调用任何setter)。因为您在Activity调用中使用片段,所以设置器将要求您首先找到片段,这可能容易出错。如果ViewPager自行检索数据,您将在适当的时间仅更新正确的片段。