关于片段创作

时间:2016-08-09 13:27:06

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

我想知道它为什么需要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;
    }
}

3 个答案:

答案 0 :(得分:0)

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

这背后的原因是保留实例并轻松地将数据保存为捆绑包。

有关详细说明,请参阅this question

编辑: 要回答其他问题,在这种情况下,每次刷卡时都会创建一个新的Fragment。如果你想保留片段,你应该使Fragment成为单身人士。

答案 1 :(得分:0)

  

我想知道为什么需要把它放入包中。

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

  

当我滑动到其他标签时,我的片段会重新创建或最后使用   创建

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

  

为什么在这个中使用了空白构造函数?

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

答案 2 :(得分:-1)

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