如何从 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
仅被调用两次,因此将 CatalogFragment
和 MyBooksFragment
添加到 registeredFragments
SparseArray。这可以解释为什么 getRegisteredFragment(2)
returns null
。但是,为什么 MyChatsFragment
实际上被创建了,而且即使 instantiateItem
甚至都没有被调用,应用程序也能完美运行?
为什么 MyChatsFragment
没有被添加到 registeredFragments
SparseArray 而其他片段是?
getItem(position)
是可行的解决方案吗?
检查 this answer 后,我通过覆盖 instantiateItem
和 destroyItem
调整了我的 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);
在使用自定义 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
仅被调用两次,因此将 CatalogFragment
和 MyBooksFragment
添加到 registeredFragments
SparseArray。这可以解释为什么 getRegisteredFragment(2)
returns null
。但是,为什么 MyChatsFragment
实际上被创建了,而且即使 instantiateItem
甚至都没有被调用,应用程序也能完美运行?
为什么 MyChatsFragment
没有被添加到 registeredFragments
SparseArray 而其他片段是?
getItem(position)
是可行的解决方案吗?
检查 this answer 后,我通过覆盖 instantiateItem
和 destroyItem
调整了我的 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);