* 編集 *
@ElliotM が指摘したように、より良い解決策があります。アダプターで何も変更する必要はありません。次のようにフラグメントを取得するだけです。
Fragment myFragment = (Fragment) adapter.instantiateItem(viewPager, viewPager.getCurrentItem());
* 古いソリューション *
最良のオプションは、ここでの 2 番目のソリューションです
。
つまり、すべての「アクティブな」フラグメント ページを追跡します。この場合、ViewPager で使用される FragmentStatePagerAdapter でフラグメント ページを追跡します。
public Fragment getItem(int index) {
Fragment myFragment = MyFragment.newInstance();
mPageReferenceMap.put(index, myFragment);
return myFragment;
}
「非アクティブな」フラグメント ページへの参照を保持しないようにするには、FragmentStatePagerAdapter の destroyItem(...) メソッドを実装する必要があります。
public void destroyItem(View container, int position, Object object) {
super.destroyItem(container, position, object);
mPageReferenceMap.remove(position);
}
...そして、現在表示されているページにアクセスする必要がある場合は、次を呼び出します。
int index = mViewPager.getCurrentItem();
MyAdapter adapter = ((MyAdapter)mViewPager.getAdapter());
MyFragment fragment = adapter.getFragment(index);
... MyAdapter の getFragment(int) メソッドは次のようになります。
public MyFragment getFragment(int key) {
return mPageReferenceMap.get(key);
}
- - 編集:
また、向きを変更した後のために、これをアダプターに追加します。
/**
* After an orientation change, the fragments are saved in the adapter, and
* I don't want to double save them: I will retrieve them and put them in my
* list again here.
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
MyFragment fragment = (MyFragment) super.instantiateItem(container,
position);
mPageReferenceMap.put(position, fragment);
return fragment;
}