检索从ViewPager一个片段片段、ViewPager

2023-09-11 10:26:09 作者:自甘堕落.

我使用了一个 ViewPager 连同 FragmentStatePagerAdapter 举办三种不同的片段:

I'm using a ViewPager together with a FragmentStatePagerAdapter to host three different fragments:

[片段1] [Fragment2] [Fragment3]

当我想要得到片段1 ViewPager FragmentActivity

这是什么问题,怎么解决呢?

What is the problem, and how do I fix it?

推荐答案

主要答案依赖于由框架生成一个名称。如果这都没有改变的话,那将不再起作用。

The main answer relies on a name being generated by the framework. If that ever changes, then it will no longer work.

那么这个解决方案,覆盖 instantiateItem() destroyItem()你的片段(州)PagerAdapter

What about this solution, overriding instantiateItem() and destroyItem() of your Fragment(State)PagerAdapter:

public class MyPagerAdapter extends FragmentStatePagerAdapter {
    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

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

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

    @Override
    public Fragment getItem(int position) {
        return MyFragment.newInstance(...); 
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);
    }

    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }
}

这似乎在与片段可处理为我工作。尚未被实例化片段,当调用 getRegisteredFragment 将返回null。但我一直在使用这个已经大部分得到电流片段出的 ViewPager adapater.getRegisteredFragment(viewPager.getCurrentItem()),这将不会返回

This seems to work for me when dealing with Fragments that are available. Fragments that have not yet been instantiated, will return null when calling getRegisteredFragment. But I've been using this mostly to get the current Fragment out of the ViewPager: adapater.getRegisteredFragment(viewPager.getCurrentItem()) and this won't return null.

我不知道该解决方案的任何其他缺点。如果有任何,我想知道。

I'm not aware of any other drawbacks of this solution. If there are any, I'd like to know.

 
精彩推荐
图片推荐