【问题标题】:About Fragment Creation关于片段创建
【发布时间】:2016-08-22 10:47:32
【问题描述】:

我想知道为什么它需要putInt 成束。当我滑动到其他选项卡时,我的片段是重新创建还是使用了最后创建的?为什么这里使用了空白构造函数?

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0 : return fragment_zg.newInstance(position + 1);
            case 1: return fragment_Uni.newInstance(position+1);
            default: return fragment_zg.newInstance(position + 1);
    }
}

这是我的Fragment

public  class fragment_Uni extends Fragment {
    private static final String ARG_SECTION_NUMBER = "section_number";
    public fragment_Uni() {}

    public static fragment_Uni newInstance(int sectionNumber) {
        fragment_Uni uni_fragment = new fragment_Uni();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        uni_fragment.setArguments(args);
        return uni_fragment;
    }
}

【问题讨论】:

  • 您要求哪个参数?
  • 抱歉,Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); uni_fragment.setArguments(args);
  • 如果不使用参数,则无需使用。对于设备方向更改,您必须向片段管理器提供一个空/空白构造函数。不管你是否改变了方向。

标签: android android-fragments android-viewpager android-tablayout


【解决方案1】:

我想知道为什么需要将Int放入bundle中。

如果您想将某个值传递给Fragment,那么您需要使用Bundle,然后将其设置为Fragment 的参数。否则,参数不会保留在Fragment 娱乐中。如果您的Fragment 不需要参数或者不是强制性的,则可以省略Bundle

当我滑动到其他选项卡时,我的片段被重新创建或最后使用 创建?

它将使用最后创建的,但如果您想更新,则必须刷新页面适配器,否则数据将不会更新。

为什么这里使用了空白构造函数?

这是Fragment 所需的默认构造函数。

【讨论】:

    【解决方案2】:

    Fragment 始终需要默认构造函数,但不能有任何其他构造函数。这就是我们使用静态方法创建实例并将参数传递给它的原因。

    这样做的原因是为了保留实例并轻松将数据保存为捆绑包。

    更多解释请见this question

    编辑: 为了回答您的其他问题,在这种情况下,每次滑动都会创建一个新的Fragment。如果您想保留这些片段,您应该将 Fragment 设为 Singleton。

    【讨论】:

      【解决方案3】:

      这是因为 Fragments 在 Android 系统中的重新创建方式。当 Android 重新创建片段时,它使用反射(Java 反射 API)重建它们,因此它假定构造函数没有参数(因为其他方式它不知道如何使用它)。那么为什么需要片段参数呢?参数存储在一个 Bundle 对象中,Android 知道如何重新创建它,这就是它使用 Bundle 的原因,Android 只需将参数包再次传递给您的片段,您的片段使用存储的值来重新创建自己。

      【讨论】:

      • @Downvoter 我想知道您对我的回答投反对票的原因。用户询问了非参数构造函数和Bundle的原因,所以我不知道为什么不赞成。
      • setArgument(bundle) 恢复我上次创建时存在的片段值??
      • 不完全是。当您将数据存储在片段参数包中时,当 Android 恢复您的片段时,它将再次传递参数包,因此您的最后一个值将在那里(例如,当您按下主页按钮并且 Android 将您的应用程序放入缓存中时)。那是因为 Android 知道如何存储和恢复 Bundle 对象,所以这就是使用 Bundle 的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多