ViewPager中怎么获取Fragment
2015-06-30 11:20
260 查看
一般来讲,我们再使用viewpager的时候,是在代码中动态的添加fragment。此时,我们不能去指定fragment的id,也不能指定他的tag,如果你一定要去指定tag,运行时会提示,tag已经被指定。那么,在动态的添加了fragment之后,我们如何能获取到该fragment并修改其中的内容呢。两种方法:
第一种方法实际上是一种hack方法,并没有官方文档说明支持。代码如下:
SomeFragment someFragment = getSupportFragmentManager().FindFragmentByTag(“android:switcher:” + R.id.viewpager + “:0″);
if (someFragment != null) //可能没有实例化
{
if (someFragment.getView() != null)
{
someFragment.updateView();//自定义方法更新
}
}
这里要记住的就是”android:switcher:” + R.id.viewpager + “:0″ 这个字符窜表示的就是该fragment的tag,其中0 是fragment 在viewpager中的位置。R.id.viewpager是布局文件中的id.]
方法二
第二种方法更正规,因为第一种方法对基于FragmentPagerAdapter的实现是有效的,但对于
FragmentStatePagerAdapter就无效了。因为FragmentStatePagerAdapter不会对传给
FragmentManager的Fragment设置tag.
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,而是直接返回引用。
按理说按以上的方法应该不会出错!!但是当我初始化viewpager,然后获得相应fragment实例,调用其成员函数,发现老是出现NullPointerException,就是执行不出来!!!无语了!!偶然发现:继承自FragmentPagerAdapter的MyPagerAdapter在初始化的时候并没有执行getItem方法,getPageTitle方法倒是执行了,导致相应的fragment实例不存在,从而当调用其方法时候就会出错,事实确实如此:fragment为null,终于找到问题的所在了!
那怎么解决呢?
首先,把调用相应fragment的成员函数的语句给注释掉,这时候程序正确运行,getItem方法也正确执行了。
那么当加上调用fragment成员函数之后要怎么处理呢?既然是getItem方法没有执行,那么我就再初始化之后先延时一段时间,再调用fragment成员函数来刷新fragment,程序运行成功!!!getItem方法也正确执行了!!
第一种方法实际上是一种hack方法,并没有官方文档说明支持。代码如下:
SomeFragment someFragment = getSupportFragmentManager().FindFragmentByTag(“android:switcher:” + R.id.viewpager + “:0″);
if (someFragment != null) //可能没有实例化
{
if (someFragment.getView() != null)
{
someFragment.updateView();//自定义方法更新
}
}
这里要记住的就是”android:switcher:” + R.id.viewpager + “:0″ 这个字符窜表示的就是该fragment的tag,其中0 是fragment 在viewpager中的位置。R.id.viewpager是布局文件中的id.]
方法二
第二种方法更正规,因为第一种方法对基于FragmentPagerAdapter的实现是有效的,但对于
FragmentStatePagerAdapter就无效了。因为FragmentStatePagerAdapter不会对传给
FragmentManager的Fragment设置tag.
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,而是直接返回引用。
按理说按以上的方法应该不会出错!!但是当我初始化viewpager,然后获得相应fragment实例,调用其成员函数,发现老是出现NullPointerException,就是执行不出来!!!无语了!!偶然发现:继承自FragmentPagerAdapter的MyPagerAdapter在初始化的时候并没有执行getItem方法,getPageTitle方法倒是执行了,导致相应的fragment实例不存在,从而当调用其方法时候就会出错,事实确实如此:fragment为null,终于找到问题的所在了!
那怎么解决呢?
首先,把调用相应fragment的成员函数的语句给注释掉,这时候程序正确运行,getItem方法也正确执行了。
那么当加上调用fragment成员函数之后要怎么处理呢?既然是getItem方法没有执行,那么我就再初始化之后先延时一段时间,再调用fragment成员函数来刷新fragment,程序运行成功!!!getItem方法也正确执行了!!
相关文章推荐
- 程序员篇:8个开发技巧助你薪水更上一层楼
- 计算机视觉方面的好的代码,俺会一直捡柴
- *********背景音乐*******
- HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR的使用 php
- Android 使用Parcelable序列化对象
- Linux操作系统中用RPM安装GCC过程解析
- Python连接Redis连接配置
- Ext.Ajax.request和form.getForm().submit的区别
- 网狐框架分析八--web登录游戏大厅流程 150629
- 真正的智能家居路在何方?
- ListView
- 背景音乐功能
- 网狐框架分析七--完整游戏流程 150624
- 嵌入式linux 博客收藏
- Unity3D研究院之多语言用中文做KEY(七十五)
- Connection reset by peer的常见原因
- 汇报措辞:你懂得怎样向领导汇报吗(审阅、审批、批阅、批示、查阅)?
- forward declaration 前置声明
- 黑马程序员--java基础学习笔记1
- 练习:多线程实现后台播放背景音乐的service