从FragmentStatePagerAdapter访问片段

时间:2014-05-16 15:45:23

标签: android android-fragments android-viewpager fragmentstatepageradapter

我正在使用以下简单FragmentStatePagerAdapter,我希望获得对其中一个片段的引用,请记住它们可能已被破坏。

public class MyStatePagerAdapter extends FragmentStatePagerAdapter {

    private int count;

    public MyStatePagerAdapter(FragmentManager fm, int count) {
        super(fm);
        this.count= count;
    }

    @Override
    public Fragment getItem(int arg0) {

        switch (arg0) {
            case 0:
                return MyFragment1.newInstance();

            case 1:
                return MyFragment2.newInstance();

            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return count;
    }
}

我看到了this个问题,其第二个回答是,如果您致电FragmentStatePagerAdapter.instatiateItem并且已经有对该片段的引用,则不会再次调用getItem()。我查看了源代码here,据我了解,这确实发生了什么。

然而,我想知道,我可以做以下事情吗?这看起来很简单,但事实是我还没有看到它在任何地方被使用,这让我怀疑某些事情是错的,我无法看到。

所以基本上我的问题是:使用类似下面的内容来访问片段时会出现什么错误?

public class MyStatePagerAdapter extends FragmentStatePagerAdapter {

    private int count;
    private MyFragment1 myFragment1;
    private MyFragment2 myFragment2;

    public MyStatePagerAdapter(FragmentManager fm, int count) {
        super(fm);
        this.count= count;
    }

    @Override
    public Fragment getItem(int arg0) {

        switch (arg0) {
            case 0:
                if (myFragment1 == null) {
                    myFragment1 = MyFragment1.newInstance();
                }
                return myFragment1;
            case 1:
               if (myFragment2 == null) {
                   myFragment2 = MyFragment2.newInstance();
               }
               return myFragment2;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return count;
    }

}

为了得到它,我会打电话给getItem(position)

1 个答案:

答案 0 :(得分:1)

我看到这种方法的一个问题是myFragment1myFragment2不是null。假设你摆脱了null检查。每次拨打Fragment时,您都会产生新的getItem()问题。

我看到的另一个问题是getItem()将始终返回null。您的break中没有switch个语句,因此它会一直显示default null的{​​{1}}个案。如果添加相应的breaks,则在return之后添加相应的if(){...}语句之前,代码不应编译。

另外,我建议您养成在方法参数中添加有意义名称的习惯。