由于Fragment的方便性,现在很多人开始大量使用Fragment。 今天使用时遇到各问题,记录下来并分享下。
使用Fragment都会用FragmentActivity ,特别是在用到ViewPager时。因为需要FramgmentManager,
而我这次有两个fragment中都用到了ViewPager。 其实也是开始的时候没考虑好。然后都使用的FragmentActivity的FramgmentManager去处理。 但是发现在第一个页面打开后,进入第二个页面,此时第二个页面上内容是空的,查看log,第二个页面的ViewPager 的子view的onCreatView 方法并没有调用,这是什么鬼。。
百度发现是PagerAdapter的instantiateItem 中使用tag从FramgmentManager中查询Fragment的,如果找到了,会直接使用之前的,而不会重新创建,
PagerAdapter的tag生成是根据你的pagerID 和 index 生成的。
说明什么呢?说明第一个页面中存在和第二个页面相同tag的Fragment 。也就是有两个fragment具有相同的父id,和index。
index有重复的很好理解,那么就是说明使用了相同的pagerID。
然后想起来当时直接复制的布局文件,所以id相同,改了id,问题迎刃而解。
这个问题在于俩个关键的地方:
1.使用了相同的FramgmentManager实例
2. ViewPager的id相同。
所以平时使用这种容器类的控件,尽量使id不同,否则就可能产生类似的问题。
参考 :http://www.trinea.cn/android/android-source-code-analysis/multi-viewpager-to-fragment-not-init/