我对如何正确使用 FragmentPagerAdapter 有很多疑问。与如何创建适配器或实现方法无关,它与底层片段应如何管理实例化视图有关。
在有关 FragmentPagerAdapter 的 Android API 中,明确说明如下:
这个版本的分页器最适合在需要分页的情况下使用少数通常更静态的片段,例如一组选项卡。用户访问的每个页面的片段将保存在内存中,尽管它的视图层次结构在不可见时可能会被破坏。这可能会导致使用大量内存,因为片段实例可以保持任意数量的状态。对于较大的页面集,请考虑 FragmentStatePagerAdapter。
所以可以假设一个fragment在自己的onCreateView中返回的view,可以被Androiddispose。同样值得注意的是,当您有超过 3 个页面并在它们之间切换时,对于同一个片段实例,每个片段的 onCreateView 会被调用多次。FragmentPagerAdapter API 中给出的示例似乎与这种方法完美结合:
/**
* The Fragment's UI is just a simple text view showing its
* instance number.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
View tv = v.findViewById(R.id.text);
((TextView)tv).setText("Fragment #" + mNum);
return v;
}
请注意,在此示例中,它没有保留对 Fragment 本身中实例化视图的任何引用。但是,通常需要保存实例化的视图引用,以便进一步更新与用户交互的界面。在这种情况下,我认为视图层次结构不会按照文档中的建议被破坏(因为片段状态没有被破坏)。
在这种情况下,保存实例化视图并在下一个 onCreateView 中再次返回是合法的吗?
使用 ViewPager 中的 setOffscreenPageLimit 来增加内存中保留的页面数量而不是重用视图是否更好?
当文档表明视图层次结构可以被破坏时,我的所有疑问都出现了,但是如果您在片段中保留任何视图引用......它们不能被垃圾收集器破坏。我是对的?