如何在MainActivity中获取由ViewPager创建的片段元素?

时间:2019-01-20 18:19:32

标签: java android android-fragments android-viewpager

我有几个用ViewPager整理的片段。我在MainActivity的addOnPageChangeListener方法的ViewPager中添加了onCreate,该方法给出了所选片段的位置。

即使我通过声明setOffscreenPageLimit防止片段破坏自己,但我仍然没有弄清楚如何从MainActivity访问片段,因为仅使用findViewById就可以返回空对象异常。

我想做什么:

我想访问片段的元素,例如布局和滚动视图,位于OnPageListener的{​​{1}}中:

ViewPager

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int i) { if(i == 0) { // Do something with the first fragment. } else if(i == 1) { // Do something with the second fragment. } } } 使用ViewPager

FragmentPagerAdapter

这样添加的:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                return Fragment1.newInstance(position);
            case 1:
                return Fragment2.newInstance(position);
            case 2:
                return Fragment3.newInstance(position);
            case 3:
                return Fragment4.newInstance(position);
            default:
                throw new IllegalArgumentException();
        }
    }

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

还是应该更改方法?

如果使用这种设计无法访问片段,那么什么是有效的替代路线?

我尝试在自定义mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mSectionsPagerAdapter); 中实现ViewPager.onPageChangeListener,但这似乎不是一个好的选择。

我可以处理它们各自片段中的元素,但这是一个繁琐的过程,并且难以维护,这是我寻找一种同时处理它们的方法的原因。

我知道之前也曾问过类似的问题,但是我没有找到解决方案。

1 个答案:

答案 0 :(得分:1)

不幸的是,唯一的“安全” 方法是检查FragmentPagerAdapter的源代码,并查看添加了片段的tag是什么,因为{ {1}}是从FragmentManager获取Fragment的唯一安全方法。

当然,我们需要希望该实现细节在支持库版本之间不会发生变化,但实际上多年来并未发生变化:)


无论如何,所以FragmentPagerAdapter说:

findFragmentByTag

那么 // Do we already have this fragment? String name = makeFragmentName(container.getId(), itemId); Fragment fragment = mFragmentManager.findFragmentByTag(name); 是什么?

name

什么是private static String makeFragmentName(int viewId, long id) { return "android:switcher:" + viewId + ":" + id; } 和什么viewId

ViewId是id,其中container.getId()container本身。

ViewPager是:id,默认情况下是final long itemId = getItemId(position);


因此,您可以找到以下片段:

return position;