从viewpager访问Fragment每次都返回null?

时间:2015-08-11 10:42:58

标签: android android-fragments android-viewpager

我的主机活动有一个包含两个片段A和B的viewpager。我的活动代码如下所示:

public class MainActivity extends AppCompatActivity implements
        OnDataLoadedListener {

    private ViewPager pager;
    private MyPagerAdapter adapter;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pager = (ViewPager) findViewById(R.id.pager);
        adapter = new MyPagerAdapter(getSupportFragmentManager());
        pager.setAdapter(adapter);

        final int pageMargin = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
                        .getDisplayMetrics());
        pager.setPageMargin(pageMargin);
        tabLayout.setupWithViewPager(pager);
}


public class MyPagerAdapter extends FragmentPagerAdapter {

        private final String[] TITLES = { "A",
                "B" };

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

        @Override
        public CharSequence getPageTitle(int position) {
            return TITLES[position];
        }

        @Override
        public int getCount() {
            return TITLES.length;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {

            case 0:
                return A.getInstance();
            case 1:
                return B.getInstance();
            }
            return null;
        }

    }

public Fragment findFragmentByPosition(int position) {
        return getSupportFragmentManager().findFragmentByTag(
                "android:switcher:" + pager.getId() + ":"
                        + adapter.getItemId(position));
    }

现在,当活动开始viewpager正确填充片段时,我尝试使用以下代码访问fragmentby:

if (AFragment == null)
    AFragment = (A) findFragmentByPosition(0);
if (BFragment == null)
    BFragment = (B) findFragmentByPosition(1);

AFragment BFragment 始终包含null。我已阅读其他simmilar question但它也没有帮助。我需要访问片段,因为我想从主机活动中调用片段中定义的一些方法。

获取片段实例的代码:

public static AFragment getInstance() {
        AFragment fragment = new AFragment();
        return fragment;
    }

1 个答案:

答案 0 :(得分:0)

我认为问题是您需要将方法移动到适配器,因为您需要FragmentManager的原始实例:

 public class MyPagerAdapter  extends FragmentPagerAdapter {

FragmentManager fm;

private final String[] TITLES = { "A",
        "B" };

public MyPagerAdapter (FragmentManager fm) {
    super(fm);
    this.fm = fm;
}

@Override
public CharSequence getPageTitle(int position) {
    return TITLES[position];
}

@Override
public int getCount() {
    return TITLES.length;
}

@Override
public Fragment getItem(int position) {
    switch (position) {

        case 0:
            return A.getInstance();
        case 1:
            return B.getInstance();
    }
    return null;
}



public Fragment findFragmentByPosition(int position, int pagerId) {
    return fm.findFragmentByTag(
            "android:switcher:" + pagerId + ":"
                    + getItemId(position));
}
}

所以现在你可以打电话:

 adapter.findFragmentByPosition(position, pager.getId());