正常情况下,Fragment会随着活动的销毁而销毁,随着活动的重建而重建。所以为了避免重复创建Fragment,需要对Fragment进行检查是否为null。
那现在放入ViewPager的Fragment是不是也是遵循这个规则的?是否有必要要创建Fragment前进行检查?要检查的话应该怎么获取这些fragment?因为以我现在的知识找不到可以设置id或者tag的地方
1.在xml中直接对fragment设置id
2.在add,repalce中设置tag,
但是现在这两种方法都用不了了。。。
正常情况下,Fragment会随着活动的销毁而销毁,随着活动的重建而重建。所以为了避免重复创建Fragment,需要对Fragment进行检查是否为null。
那现在放入ViewPager的Fragment是不是也是遵循这个规则的?是否有必要要创建Fragment前进行检查?要检查的话应该怎么获取这些fragment?因为以我现在的知识找不到可以设置id或者tag的地方
1.在xml中直接对fragment设置id
2.在add,repalce中设置tag,
但是现在这两种方法都用不了了。。。
1 回答1.4k 阅读
2 回答978 阅读
1 回答1.2k 阅读
1 回答1.1k 阅读
1 回答963 阅读
1 回答924 阅读
738 阅读
你想获取嵌在ViewPager中的Fragment的目的是什么?更新Fragment吗?
如果是这个目的的话,需要实现ViewPager的FragmentPagerAdapter,然后override方法
getItemPosition(Object object)
,把入口参数object强制转型为你定义的Fragment类;所以你还需要为自定义的Fragment实现一个public方法,比如
public void update()
用来更新界面。你需要调用这个方法
PagerAdapter.notifyDataSetChanged()
,getItemPosition
才会被调用到。不建议通过记录tag或者id的方式来管理ViewPager内的Fragment。
Update
之前对问题的理解错了,你的问题应该从生命周期和ViewPager的adapter来理解。
Fragment具有和Activity相似的生命周期,并且其生命周期方法由托管它的Activity调用。
当把一些Fragment放入ViewPager时,就需要adapter的支持,以管理这些Fragment。对于常用的两种adapter,FragmentStatePagerAdapter会销毁掉不需要的fragment,而FragmentPagerAdapter只是销毁了fragment的视图。
这些都是交由Adapter来管理的,你只需要覆写adapter相应的方法以创建Fragment并提供给adapter。
不需要做检查,检查的工作是由adapter来完成的。比如,
最开始处于第0页时,adapter不仅为第0页创建Fragment实例,还为相邻的第1页创建了Fragment实例,此时覆写的
Fragment getItem(int position);
就会被调用2次;第1次从第0页滑到第1页,adapter同样会为相邻的第2页创建Fragment实例;
Fragment getItem(int position);
又被调用1次;此时,从第2页返回第0页,
对于FragmentPagerAdapter,第0页仅视图被销毁了,所以它的
onCreateView()
会被调用到。对于FragmentStatePagerAdapter,第0页的实例被销毁了,所以
getItem(0)
会被再次调用,整个Fragment对应的生命周期函数会再走一遍。所以结论是,ViewPager中的Fragment交由Adapter管理,你不需要担心是否重建。你只需要根据应用场景选择合适的adapter。
更详细的说明,你可以参考我之前整理的一篇文章中的一部分ViewPager和它的adapter是如何配合工作的?
下面是相关的生命周期函数调用情况:
当刚启动一个Activity时,Activity和Fragment都将被创建:
当Activity进入后台后:
当Activity返回前台后:
当Activity被销毁后: