84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
正常情况下,Fragment会随着活动的销毁而销毁,随着活动的重建而重建。所以为了避免重复创建Fragment,需要对Fragment进行检查是否为null。那现在放入ViewPager的Fragment是不是也是遵循这个规则的?是否有必要要创建Fragment前进行检查?要检查的话应该怎么获取这些fragment?因为以我现在的知识找不到可以设置id或者tag的地方1.在xml中直接对fragment设置id2.在add,repalce中设置tag,但是现在这两种方法都用不了了。。。
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
你想获取嵌在ViewPager中的Fragment的目的是什么?更新Fragment吗?如果是这个目的的话,需要实现ViewPager的FragmentPagerAdapter,然后override方法getItemPosition(Object object),把入口参数object强制转型为你定义的Fragment类;所以你还需要为自定义的Fragment实现一个public方法,比如public void update()用来更新界面。
getItemPosition(Object object)
public void update()
你需要调用这个方法PagerAdapter.notifyDataSetChanged(), getItemPosition才会被调用到。不建议通过记录tag或者id的方式来管理ViewPager内的Fragment。
PagerAdapter.notifyDataSetChanged()
getItemPosition
之前对问题的理解错了,你的问题应该从生命周期和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对应的生命周期函数会再走一遍。
Fragment getItem(int position);
onCreateView()
getItem(0)
所以结论是,ViewPager中的Fragment交由Adapter管理,你不需要担心是否重建。你只需要根据应用场景选择合适的adapter。
更详细的说明,你可以参考我之前整理的一篇文章中的一部分ViewPager和它的adapter是如何配合工作的?
当刚启动一个Activity时,Activity和Fragment都将被创建:
10-14 00:13:36.135: D/FragmentActivity(23141): onCreate() 10-14 00:13:36.371: D/FragmentActivity(23141): onStart() 10-14 00:13:36.371: D/FragmentActivity(23141): onResume() 10-14 00:13:36.449: D/FragmentActivity(23141): getItem(0) 10-14 00:13:36.452: D/Fragment0(23141): newInstance(2015-10-14) 10-14 00:13:36.452: D/FragmentActivity(23141): getItem(1) 10-14 00:13:36.453: D/Fragment1(23141): newInstance(Page1) 10-14 00:13:36.453: D/Fragment0(23141): onAttach() 10-14 00:13:36.453: D/Fragment0(23141): onCreate() 10-14 00:13:36.453: D/Fragment0(23141): onCreateView() 10-14 00:13:36.457: D/Fragment0(23141): onViewStateRestored 10-14 00:13:36.458: D/Fragment0(23141): onStart() 10-14 00:13:36.458: D/Fragment0(23141): onResume() 10-14 00:13:36.458: D/Fragment1(23141): onAttach() 10-14 00:13:36.458: D/Fragment1(23141): onCreate() 10-14 00:13:36.458: D/Fragment1(23141): onCreateView() 10-14 00:13:36.465: D/Fragment1(23141): onStart() 10-14 00:13:36.465: D/Fragment1(23141): onResume()
当Activity进入后台后:
10-14 00:14:13.273: D/Fragment0(23141): onPause() 10-14 00:14:13.273: D/Fragment1(23141): onPause() 10-14 00:14:13.273: D/FragmentActivity(23141): onPause() 10-14 00:14:14.190: D/Fragment0(23141): onSaveInstanceState() 10-14 00:14:14.191: D/Fragment1(23141): onSaveInstanceState() 10-14 00:14:14.191: D/Fragment0(23141): onStop() 10-14 00:14:14.191: D/Fragment1(23141): onStop() 10-14 00:14:14.191: D/FragmentActivity(23141): onStop()
当Activity返回前台后:
10-14 00:14:37.410: D/Fragment0(23141): onStart() 10-14 00:14:37.410: D/Fragment1(23141): onStart() 10-14 00:14:37.411: D/FragmentActivity(23141): onStart() 10-14 00:14:37.411: D/FragmentActivity(23141): onResume() 10-14 00:14:37.431: D/Fragment0(23141): onResume() 10-14 00:14:37.432: D/Fragment1(23141): onResume()
当Activity被销毁后:
10-14 00:14:58.725: D/Fragment0(23141): onPause() 10-14 00:14:58.726: D/Fragment1(23141): onPause() 10-14 00:14:58.726: D/FragmentActivity(23141): onPause() 10-14 00:14:59.412: D/Fragment0(23141): onStop() 10-14 00:14:59.412: D/Fragment1(23141): onStop() 10-14 00:14:59.412: D/FragmentActivity(23141): onStop() 10-14 00:14:59.413: D/Fragment0(23141): onDestroyView() 10-14 00:14:59.413: D/Fragment0(23141): onDestroy() 10-14 00:14:59.413: D/Fragment0(23141): onDetach() 10-14 00:14:59.414: D/Fragment1(23141): onDestroyView() 10-14 00:14:59.414: D/Fragment1(23141): onDestroy() 10-14 00:14:59.414: D/Fragment1(23141): onDetach() 10-14 00:14:59.414: D/FragmentActivity(23141): onDestroy()
你想获取嵌在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被销毁后: