Android ViewPager嵌套ViewPager+Fragment问题

最近在项目中又遇到了ViewPager互相嵌套的问题,代码实现很简单,主要可能出现的问题是子ViewPager的fragment滑动出现白屏,这个问题的出现是FragmentManager方法调用错误,android中涉及到FragmentManager的方法主要有:getChildFragmentManager()、getFragmentManager()和getSupportFragmentManager(),下面分别介绍三种方法的区别

1.getChildFragmentManager()方法
官方文档说明如下

Return a private FragmentManager for placing and managing Fragments 
inside of this Fragment.

返回一个FragmentManger为了管理和设置当前Fragment内部的Fragment们,比如上文所说的,外层ViewPager(父ViewPager)中的Fragment(父Fragment)嵌套内层ViewPager(子ViewPager)+内层Fragment(子Fragment),子Fragment的FragmentManager的获取方法就需要调用getChildFragmentManager()方法。

2.getFragmentManager()方法

官方说明如下

Return the FragmentManager for interacting with fragments associated
with this fragment's activity.

返回一个FragmentManager为了与当前Activity内部的Fragment们进行交互,因为3.0以后才有Fragment控件,所以该方法适用于3.0以后的系统,父控件为Activity的情况。

3.getSupportFragmentManager()方法

官方说明如下

Return the FragmentManager for interacting with fragments associated
with this activity.

方法介绍和getFragmentManager()方法相同,区别是该方法位于FragmentActivity内。因为Fragment是3.0以后才出现的组件,为了这之前的系统版本也能使用Fragment,借助V4包里面的getSupportFragmentManager()方法来间接获取FragmentManager对象。

方法总结,需要管理相互独立且隶属于Activity/FragmentActivity的Fragment使用getFragmentManager()/getSupportFragmentManager(),而在Fragment中添加Fragment要使用getChildFragmetManager()来管理。

4.关于ViewPager Adapter的说明
在我们调用ViewPager的Adapter可继承的类有PagerAdapter、FragmentPagerAdapter和FragmentStatePagerAdapter,后两个都是PagerAdapter的子类。
FragmentPagerAdapter 继承自 PagerAdapter。相比通用的 PagerAdapter,该类更专注于每一页均为 Fragment 的情况。如文档所述,该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter。
FragmentStatePagerAdapter 和前面的 FragmentPagerAdapter 一样,是继承子 PagerAdapter。但是,和 FragmentPagerAdapter 不一样的是,正如其类名中的 ‘State’ 所表明的含义一样,该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。

你可能感兴趣的:(android)