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

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

你想获取嵌在ViewPager中的Fragment的目的是什么?更新Fragment吗?
如果是这个目的的话,需要实现ViewPager的FragmentPagerAdapter,然后override方法getItemPositionObject 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 getItemint position;就会被调用2次;
第1次从第0页滑到第1页,adapter同样会为相邻的第2页创建Fragment实例;Fragment getItemint position;又被调用1次;
此时,从第2页返回第0页,
对于FragmentPagerAdapter,第0页仅视图被销毁了,所以它的onCreateView会被调用到。
对于FragmentStatePagerAdapter,第0页的实例被销毁了,所以getItem0会被再次调用,整个Fragment对应的生命周期函数会再走一遍。

所以结论是,ViewPager中的Fragment交由Adapter管理,你不需要担心是否重建。你只需要根据应用场景选择合适的adapter。

更详细的说明,你可以参考我之前整理的一篇文章中的一部分ViewPager和它的adapter是如何配合工作的?

下面是相关的生命周期函数调用情况:

当刚启动一个Activity时,Activity和Fragment都将被创建:

10-14 00:13:36.135: D/FragmentActivity23141: onCreate
10-14 00:13:36.371: D/FragmentActivity23141: onStart
10-14 00:13:36.371: D/FragmentActivity23141: onResume
10-14 00:13:36.449: D/FragmentActivity23141: getItem0
10-14 00:13:36.452: D/Fragment023141: newInstance2015-10-14
10-14 00:13:36.452: D/FragmentActivity23141: getItem1
10-14 00:13:36.453: D/Fragment123141: newInstancePage1
10-14 00:13:36.453: D/Fragment023141: onAttach
10-14 00:13:36.453: D/Fragment023141: onCreate
10-14 00:13:36.453: D/Fragment023141: onCreateView
10-14 00:13:36.457: D/Fragment023141: onViewStateRestored
10-14 00:13:36.458: D/Fragment023141: onStart
10-14 00:13:36.458: D/Fragment023141: onResume
10-14 00:13:36.458: D/Fragment123141: onAttach
10-14 00:13:36.458: D/Fragment123141: onCreate
10-14 00:13:36.458: D/Fragment123141: onCreateView
10-14 00:13:36.465: D/Fragment123141: onStart
10-14 00:13:36.465: D/Fragment123141: onResume

当Activity进入后台后:

10-14 00:14:13.273: D/Fragment023141: onPause
10-14 00:14:13.273: D/Fragment123141: onPause
10-14 00:14:13.273: D/FragmentActivity23141: onPause
10-14 00:14:14.190: D/Fragment023141: onSaveInstanceState
10-14 00:14:14.191: D/Fragment123141: onSaveInstanceState
10-14 00:14:14.191: D/Fragment023141: onStop
10-14 00:14:14.191: D/Fragment123141: onStop
10-14 00:14:14.191: D/FragmentActivity23141: onStop

当Activity返回前台后:

10-14 00:14:37.410: D/Fragment023141: onStart
10-14 00:14:37.410: D/Fragment123141: onStart
10-14 00:14:37.411: D/FragmentActivity23141: onStart
10-14 00:14:37.411: D/FragmentActivity23141: onResume
10-14 00:14:37.431: D/Fragment023141: onResume
10-14 00:14:37.432: D/Fragment123141: onResume

当Activity被销毁后:

10-14 00:14:58.725: D/Fragment023141: onPause
10-14 00:14:58.726: D/Fragment123141: onPause
10-14 00:14:58.726: D/FragmentActivity23141: onPause
10-14 00:14:59.412: D/Fragment023141: onStop
10-14 00:14:59.412: D/Fragment123141: onStop
10-14 00:14:59.412: D/FragmentActivity23141: onStop
10-14 00:14:59.413: D/Fragment023141: onDestroyView
10-14 00:14:59.413: D/Fragment023141: onDestroy
10-14 00:14:59.413: D/Fragment023141: onDetach
10-14 00:14:59.414: D/Fragment123141: onDestroyView
10-14 00:14:59.414: D/Fragment123141: onDestroy
10-14 00:14:59.414: D/Fragment123141: onDetach
10-14 00:14:59.414: D/FragmentActivity23141: onDestroy

发表评论

电子邮件地址不会被公开。 必填项已用*标注