在做一个简单的APP应用时,出现了fragment的错位和空白问题,先看图
打开App加载的这个页面就是主界面,添加了四个fragment,监听下面的radiogroup实现fragment的显示和隐藏,在首页这个fragment中嵌套了viewpager,里面放的是fragment,ok,到这里没一点问题,接下来问题就出现了,审查对应的fragment布局是和首页的fragment一模一样的,用的是同一个适配器,下面是我的适配器的代码
package com.example.user.baozoumanhua.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
/**
* Created by user on 2016/8/22.
*/
public class ViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mData;
private List<NewsType> names;
public ViewPagerAdapter(FragmentManager fm, List<Fragment> mData) {
super(fm);
this.mData = mData;
}
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
public ViewPagerAdapter(FragmentManager fm, List<Fragment> mData, List<NewsType> names) {
super(fm);
this.mData = mData;
this.names = names;
}
@Override
public Fragment getItem(int position) {
return mData.get(position);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public CharSequence getPageTitle(int position) {
return names.get(position).getName();
}
}
适配器很常规,没什么特殊的,但是问题来了,运行后审查界面的viewpager不显示,而且多运行几次后会出现本应该在审查界面的fragment会出现在首页中,这就蛋疼了,然后想到肯定是fragment的管理出问题了,在创建适配器的时候需要传入一个FragmentMananger对象,那么很可能是我在创建适配器的时候传入的FragmentMananger对象是同一个,两个界面用到的适配器使用的是同一个FragmentMananger对象,所以才造成了混乱问题和不显示问题,知道问题出在哪了那么就好办了,现在只需要让两个适配器使用的不是同一个FragmentMananger对象就可以了,
查资料后发现使用getChildFragmentManager();来代替getSupportFragmentManager();获取FragmentMananger能解决问题,因为getChildFragmentManager()会为本fragment创建一个私有的FragmentManager,同时还会根据本Fragment所处的状态来更新私有FragmentManagger里卖弄缓存的Fragment,
TestViewPagerAdapter adapter = new TestViewPagerAdapter(getChildFragmentManager(),mdata);
只需要更改这一句代码就Ok啦!!!