当
FragmentPagerAdapter增加一个片段到FragmentManager,它使用基于特定位置,该片段将被置于一个特殊的标记。
FragmentPagerAdapter.getItem(intposition)仅在该位置的片段不存在时才调用。旋转后,Android将注意到它已经为该特定位置创建/保存了一个片段,因此它仅尝试使用进行重新连接
FragmentManager.findFragmentByTag(),而不是创建一个新片段。使用时,所有这些都是免费的,这
FragmentPagerAdapter就是为什么通常在方法中包含片段初始化代码的原因
getItem(int)。
即使我们不使用a
FragmentPagerAdapter,也不是每次在中创建一个新片段都是一个好主意
Activity.onCreate(Bundle)。如您所知,将片段添加到FragmentManager时,将在旋转后为您重新创建它,而无需再次添加。这样做是处理片段时出错的常见原因。
使用片段的常用方法是:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... CustomFragment fragment; if (savedInstanceState != null) { fragment = (CustomFragment) getSupportFragmentManager().findFragmentByTag("customtag"); } else { fragment = new CustomFragment(); getSupportFragmentManager().beginTransaction().add(R.id.container, fragment, "customtag").commit(); } ...}当使用时
FragmentPagerAdapter,我们将片段管理交给适配器,而不必执行上述步骤。默认情况下,它只会在当前位置的前后预先加载一个Fragment(尽管除非使用,否则它不会销毁它们
FragmentStatePagerAdapter)。这由ViewPager.setOffscreenPageLimit(int)控制。因此,不能保证在适配器外部的片段上直接调用方法是有效的,因为它们甚至可能没有生命。
长话短说,您使用的解决方案
putFragment可以随后获得参考,这并不是那么疯狂,也与普通使用片段的方式不同(上图)。否则很难获得参考,因为该片段是由适配器而不是您本人添加的。只要确保它
offscreenPageLimit足够高,就可以始终加载所需的片段,因为您依赖于它的存在。这绕过了ViewPager的延迟加载功能,但似乎正是您对应用程序所期望的。
另一种方法是
FragmentPageAdapter.instantiateItem(View,int)在返回之前,重写并保存对从超级调用返回的片段的引用(它具有找到该片段(如果已经存在)的逻辑)。
要获得更完整的图片,请查看FragmentPagerAdapter(短)和ViewPager(长)的某些来源。



