如何从 ViewPager 获取片段引用

How to get fragment reference from ViewPager

在使用自定义 SectionPageAdapter.

实例化后,我试图获取对名为 MyChatsFragment 的特定片段的引用

首先,我要添加片段

    mSectionsPageAdapter.addFragment(new CatalogFragment());
    mSectionsPageAdapter.addFragment(new MyBooksfragment());
    mSectionsPageAdapter.addFragment(new MyChatsFragment());
    viewPager.setAdapter(mSectionsPageAdapter);

然后我尝试通过这种方式检索 MyChatsFragment

 MyChatsFragment myChatsFragment = (MyChatsFragment) mSectionsPageAdapter
                                                                 .getRegisteredFragment(2);

然而,getRegisteredFragment(2) returns null 在调试时我注意到以下内容:

在适配器中,instantiateItem 仅被调用两次,因此将 CatalogFragmentMyBooksFragment 添加到 registeredFragments SparseArray。这可以解释为什么 getRegisteredFragment(2) returns null。但是,为什么 MyChatsFragment 实际上被创建了,而且即使 instantiateItem 甚至都没有被调用,应用程序也能完美运行?

为什么 MyChatsFragment 没有被添加到 registeredFragments SparseArray 而其他片段是?

getItem(position) 是可行的解决方案吗?

检查 this answer 后,我通过覆盖 instantiateItemdestroyItem 调整了我的 SectionsPageAdapter,因为您将能够检查以下代码:

public class SectionsPageAdapter extends FragmentPagerAdapter{
private final List<Fragment> mFragmentList = new ArrayList<>();
private final SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

public void addFragment(Fragment fragment)
{
    mFragmentList.add(fragment);
}


public SectionsPageAdapter(FragmentManager FM)
{
    super(FM);
}
@Override
public Fragment getItem(int position) {
   return mFragmentList.get(position);
}

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

@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);
    }
}

注意:如果需要,我可以分享 MyChatsFragment 代码。

使用 Activity 或 parent Fragment 中的 viewPager.getAdapter.getItem(position);

描述(已修改) - 如您所写,addFragment()mFragmentList 添加了一个片段,您也通过调用以下方法通过此方法添加了片段:

mSectionsPageAdapter.addFragment(new MyChatsFragment())

getItem() returns 来自 mFragmentList 您添加片段的片段。所以如果你想获得 MyChatsFragment 引用,只需使用:

MyChatsFragment myChatsFragment = (MyChatsFragment) 
mSectionsPageAdapter .getItem(position);

MyChatsFragment myChatsFragment = (MyChatsFragment) 
viewPager.getAdapter.getItem(position);