您的位置:首页 > 移动开发 > Android开发

Android - Fragment 内嵌 ViewPager ,ViewPager各个页面使用Fragment第二次进入空白界面

2017-04-11 11:23 736 查看

唠叨

标题好长啊,我也不想啊,为了你们,我只能这么写这么长,描述清楚问题嘛!

再说一遍问题 :

Fragment
内嵌
ViewPager
, 而
ViewPager
各个页面使用
Fragment
实现,第一次进入没问题,第二次及其以后的进入前两页空白,什么都没有!

因为之前从没有做过多
Fragment
嵌套,之前开发都是 单
Activity
- 单
Fragment
实现,这次改变了开发思路,因为是小应用,就想着使用 单
Activity
- 多
Fragment
实现,没想到在
Fragment
中使用
ViewPager
的时候,会出现空白问题,查了好多说是
ViewPagerAdapter
重新实例化了,但我想了,这每次进入肯定要实例化啊,因为重新进入了啊!后就那个纠结啊,还有人说使用
getChildFragmentManager
() ,但是当时我的
Adapter
使用的是
FragmentStatePagerAdapter
这就尴尬了,居然报下面错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:667)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211)
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1319)
at android.view.View.dispatchRestoreInstanceState(View.java:13795)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3016)
....


不开心了,明明
Google
推荐使用
FragmentStatePagerAdapter
到头来居然使用不了!

当然你可以看下面文章学习使用
FragmentStatePagerAdapter
:

Android-ViewPager(FragmentPagerAdapter 和 FragmentStatePagerAdapter

最后改成
FragmentPagerAdapter
才正常,下面总结下。

描述问题

Fragment
内嵌
ViewPager
, 而
ViewPager
各个页面使用
Fragment
实现,第一次进入没问题,第二次及其以后的进入前两页空白,什么都没有!

当时我的实现是:

Fragment
初始化
adapter
使用的是
getFragmentManager()


ViewPager
adapter
FragmentStatePagerAdapter


比如: 下面是我错误的实现

ContentFragment

managePageAdapter = new ManagePageAdapter(getFragmentManager(),fragments);


ManagePageAdapter

public class ManagePageAdapter extends FragmentStatePagerAdapter {}


解决

来张很烂的图,说明几个内容的关系:



所有的
Fragment
都继承自
BaseFragment


ContentFragment
内嵌
ViewPager


ViewPager
的每个页面使用的是
ListFragment
实现

少画了一层:
ContentFragment
Activity
中被
commit


解决方案就是 如图所示:

ViewPager
Adapter
使用
FragmentPageAdapter
实现

ContentFragment
中初始化
ViewPagerAdapter
的时候使用`getChildFragmentManager()

比如 下面是正确的配置:

ContentFragment

managePageAdapter = new ManagePageAdapter(getChildFragmentManager(),fragments);


ViewPagerAdapter

public class ManagePageAdapter extends FragmentPagerAdapter{}


问题探究

如果在宿主
Fragment
中使用
getFragmentManager()
初始化
Adapter
的时候,会将宿主
Fragment
Viewpager
中的子
Fragment
添加到宿主的
FragmentManager


看图:



ContentFragment
中使用
getFragmentManager()
其实就是
Activity
中的
FragmentManager


比如 打印Activity中的FragmentManager会发现 Viewpager中的Fragment被加入其中,那么这就乱套了,这个实例在第一次加载的时候被加入,所以第一次正常显示,后面的因为存在了实例未被销毁,所以在第二次及其后面的显示中,就没有再次被加入,除非它被销毁或移除才可以。

V/WorkActivity: FragmentManager >> 3
V/WorkActivity: >> ManageFragment{2de85921 #0 id=0x7f0e0080}
V/WorkActivity: >> ManageListFragment{279c3146 #1 id=0x7f0e009d android:switcher:2131624093:0}
V/WorkActivity: >> ManageListFragment{16a87f07 #2 id=0x7f0e009d android:switcher:2131624093:1}


知道了原因,就使用 分而治之 策略,在
Viewpager
中的子
Fragment
使用
ContentFragment
中的
ChildFragmentManager
来管理,各管各的就可以了。

如图 :



ContentFragment
使用
getChildFragmentManager()
获取 子
FramgetManager


分而治之 ,各管各的内容

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐