主要答案依賴于框架生成的名稱。如果這種情況發生變化,那么它將不再起作用。
那么這個解決方案呢,覆蓋instantiateItem()和destroyItem()你的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..但我一直在用這個來獲取電流Fragment走出ViewPager: adapater.getRegisteredFragment(viewPager.getCurrentItem())這個再也不會回來了null.
我不知道這個解決方案的其他缺點。如果有,我想知道。