【问题标题】:Use setArguments or method for fragment in TABs对 TAB 中的片段使用 setArguments 或方法
【发布时间】:2014-03-02 04:36:36
【问题描述】:

我正在尝试在 android 中使用 viewpager 和新的标签设计(新的 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;
        }

【问题讨论】:

  • 为什么不调用 setter 来避免序列化等等 - 因为您需要注意在适当的时间调用该 setter(比如在轮换之后) ,无论配置发生什么变化,参数都将始终可用。如果数据对象很大,您可以通过让片段直接从活动中检索数据来避免使用参数(我不知道这是否是您要问的)。
  • 完美。是的,我如何直接从我的活动中检索数据?通过 setter 传递对我的活动的引用并从该引用中检索数据。然后我们回到 setter 问题。
  • 获取对Activity(getActivity()) 的引用,然后对其调用一些方法来检索数据。这实际上不是一个设置器,其想法是避免在片段上创建Activity 调用设置器(这意味着首先找到它们(这对于ViewPager 的片段来说更棘手))。如果片段在内部管理这部分,您将确保在实际需要时将数据传递给正确的片段。
  • 谢谢.. 将其添加为答案,我会接受它:)

标签: android android-fragments


【解决方案1】:

为什么不调用 setter 来避免序列化等等?

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

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

【讨论】:

    【解决方案2】:

    Fragment 参数中的大对象迟早会失败,因为您可以在 Intent 中拥有某个最大大小(我认为它大约为 1 mB)。

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

    【讨论】:

    • 为什么说合适的时间?我的意思是,如果我调用 setter 来设置该片段中的成员变量,那么该变量不会一直存在并且片段总是存在吗?你能解释一下吗
    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多