放入ViewPager的Fragment会因为Activity发生重新启动也跟着Activity重新创建吗?

正常情况下,Fragment会随着活动的销毁而销毁,随着活动的重建而重建。所以为了避免重复创建Fragment,需要对Fragment进行检查是否为null。
那现在放入ViewPager的Fragment是不是也是遵循这个规则的?是否有必要要创建Fragment前进行检查?要检查的话应该怎么获取这些fragment?因为以我现在的知识找不到可以设置id或者tag的地方
1.在xml中直接对fragment设置id
2.在add,repalce中设置tag,
但是现在这两种方法都用不了了。。。

阅读 6.8k
1 个回答

你想获取嵌在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都将被创建:

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()
推荐问题
宣传栏