* 编辑 *
正如@ElliotM 指出的那样,有一个更好的解决方案。无需更改适配器中的任何内容,只需获取片段:
Fragment myFragment = (Fragment) adapter.instantiateItem(viewPager, viewPager.getCurrentItem());
* 旧解决方案 *
最好的选择是这里的第二种解决方案:http:
//tamsler.blogspot.nl/2011/11/android-viewpager-and-fragments-part-ii.html
简而言之:您跟踪所有“活动”片段页面。在这种情况下,您在 FragmentStatePagerAdapter 中跟踪片段页面,ViewPager..
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;
}