繁体   English   中英

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

[英]How to get elements of fragments created by ViewPager in MainActivity?

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

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

我想做的事:

我想在OnPageListenerViewPager访问片段的元素,例如布局和滚动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实现ViewPager.onPageChangeListener ,但这似乎不是一个好选择。

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

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

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

当然,我们需要希望实现细节在支持库版本之间不会改变,但实际上多年来没有改变:)


无论如何,所以FragmentPagerAdapter说:

  // 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 ,什么是id

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

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


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

Fragment fragment = fragmentManager.findFragmentByTag("android:switcher:" + viewPager.getId() + ":" + fragmentPosition);
// if fragment is null, it was not created yet by ViewPager

注意:

值得注意的是,您不应该依赖getItem(int position) {返回传入的片段实例 ,因为那样会导致此问题 (此问题正确执行, getItem()方法必须始终返回新的Fragment实例。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM