转载地址:
http://
getSupportFragmentManager().beginTransaction().add(myFragment, "Some Tag").commit();
getSupportFragmentManager().findFragmentByTag("Some Tag");
What are the different ways to get a reference to the currently visible fragment page in a ViewPager?
First Solution
You can set a unique tag on each fragment page:
... and then retrieve the fragment page via:
Using this approach, you need to keep track of the string tags and associate them with all the fragment pages. You could use a map to store each tag along with the current page index, which is set at the time when the fragment page is instantiated.
MyFragment myFragment = MyFragment.newInstance();
mPageReferenceMap.put(index, "Some Tag");
getSupportFragmentManager().beginTransaction().add(myFragment, "Some Tag").commit();
To get the tag for the currently visible page, you then call:
int index = mViewPager.getCurrentItem();
String tag = mPageReferenceMap.get(index);
... and then get the fragment page:
Fragment myFragment = getSupportFragmentManager().findFragmentByTag(tag);
Second Solution
Similar to the first solution, you keep track of all the "active" fragment pages. In this case, you keep track of the fragment pages in the FragmentStatePagerAdapter, which is used by the ViewPager.
public Fragment getItem(int index) {
Fragment myFragment = MyFragment.newInstance();
mPageReferenceMap.put(index, myFragment);
return myFragment;
}
To avoid keeping a reference to "inactive" fragment pages, we need to implement the FragmentStatePagerAdapter's destroyItem(...) method:
public void destroyItem(View container, int position, Object object) {
super.destroyItem(container, position, object);
mPageReferenceMap.remove(position);
}
... and when you need to access the currently visible page, you then call:
int index = mViewPager.getCurrentItem();
MyAdapter adapter = ((MyAdapter)mViewPager.getAdapter());
MyFragment fragment = adapter.getFragment(index);
... where the MyAdapter's getFragment(int) method looks like this:
public MyFragment getFragment(int key) {
return mPageReferenceMap.get(key);
}
I am using the second solution in my project, and it's working quite well. Here is the reference to the fullsource code.
第三种方法:
ViewPager pager = (ViewPager)findViewById(R.id.viewpager);
FragmentStatePagerAdapter f = pager.getAdapter();
SomeFragment someFragment = (SomeFragment)f.instantiateItem(pager,position);
instantiateItem(pager,position)方法会返回在position位置的fragment的引用。如果该
fragment 已经实例化了,再次调用instantiateItem(pager,position)的时候,该方法并不会调用
getItem()来再次实例化fragment,而是直接返回引用。