ViewPager中怎么获取Fragment

来源:互联网 发布:健康体检软件系统 编辑:程序博客网 时间:2024/05/01 23:23

一般来讲,我们再使用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方法也正确执行了!!

0 0
原创粉丝点击