0

我正在使用以下简单方法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;
    }
}

我看到了这个问题,它的第二个答案说如果你打电话FragmentStatePagerAdapter.instatiateItem并且已经有对片段的引用,它就不会getItem()再次调用。我在这里查看了源代码,据我了解,这确实是发生了什么。

但是,我想知道,我可以执行以下操作吗?它看起来很简单,但我没有看到它在任何地方使用的事实让我怀疑我看不到的东西确实是错误的。

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

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).

4

1 回答 1

1

我用这种方法看到的一个问题是myFragment1myFragment2不是null。假设您摆脱了null支票。Fragment问题是每次调用时都会生成一个新的getItem().

我看到的另一个问题是它getItem()总是会返回null。您的 . 中没有任何break语句switch,因此它会一直default用到null. 如果添加相应breaks的,则代码不应编译,直到您return在 s 之后添加相应的语句if(){...}

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

于 2014-05-16T15:51:57.683 回答