获取ViewPager当前展示的Fragment
2015-08-21 15:32
519 查看
转自:http://tamsler.blogspot.com/2011/11/android-viewpager-and-fragments-part-ii.html
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:
getSupportFragmentManager().beginTransaction().add(myFragment, "Some Tag").commit();
... and then retrieve the fragment page via:
getSupportFragmentManager().findFragmentByTag("Some Tag");
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.
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:
getSupportFragmentManager().beginTransaction().add(myFragment, "Some Tag").commit();
... and then retrieve the fragment page via:
getSupportFragmentManager().findFragmentByTag("Some Tag");
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.
相关文章推荐
- 【数据结构与算法】——排序算法篇
- IOS学习开发笔记(四)-----通过UIScrollView认识代理
- U-boot-2014.04移植到MINI2440(3) Makefile分析
- DOM事件
- CentOS 6.5 Git源码安装
- FastReport中TotalPages显示为0
- InstallAnywhere 的一些坑以及workaround
- 在xcode 6.4 中使用swift和object-c混合编程,同时通过cocoapods进行管理的一些问题和解决办法
- 安装GIT
- C++无名命名空间详解
- 编程语言与脚本语言之间的区别(转)
- DB2 10.5列式表存储技术
- strcpy手写代码
- MVVM设计模式基础知识--INotifyPropertyChanged接口
- 《深入理解Nginx》笔记之ngx_event_pipe_s结构体
- IOS APNS 含java服务器实现
- hpu--1703
- (?)QTableView翻页控件--MVC实现
- oracle数据库内置函数之数值函数、字符函数、日期函数、转换函数及其在查询语句中的运用
- MVVM设计模式基础知识--INotifyPropertyChanged接口