在做一个项目的时候,遇到fragment的一种情况,在两个fragment切换的时候正常,但是当有第三个fragment的时候,就会出现切换错乱甚至不显示的问题,困扰了一些时间,最后解决了,老规矩,还是发篇简书记录下坑。希望遇到的小伙伴能有个思路或借鉴下我的坑。
如果是第一次就不显示view的情况,请先检查查看你的xml文件是否正确,然后再查看第二种情况。本文要强调的是第一次能显示,但是切换第二次后就不能显示的问题。
首先看看你的fragment的onCreateView是不是这样的:
public View onCreateView(LayoutInflater inflater, @NullableViewGroup container,@NullableBundle savedInstanceState) {
mRootView = inflater.inflate(R.layout.test_paper_all_fragment, container);
initView();
return super.onCreateView(inflater, container, savedInstanceState);
}
如果是的话,请直接返回view,如下:
public View onCreateView(LayoutInflater inflater, @NullableViewGroup container,@NullableBundle savedInstanceState) { mRootView = inflater.inflate(R.layout.test_paper_all_fragment, container);
return mRootView;
}
但是当fragment有三个或者以上的时候也会出现不显示,其实这时候是因为第二次加载的时候重复调用了onCreateView()这个方法,重新new了一个pageadapter导致子fragment不显示,问题的解决方法就是在onCreateView()方法里面加入如下代码:
二次加载时候先判断if(view !=null) {
ViewGroup parent = (ViewGroup) view.getParent();
if(parent!=null) {
parent.removeView(view);
}returnview;
}
这样就可以完美的解决了,不论你反复多少次都不会再显示空白了。
2.Fragment不显示view:
这个问题一般网上的解答方法是重写isViewFromObject方法,要么删除该方法,要么重写object==view的值。具体文章内容如下:
或者查看原文地址
首先就是重写fragmentviewpager了
public class ViewPagerAdp extends FragmentPagerAdapter{
ListmBaseFgList;
public ViewPagerAdp(FragmentManager fm, ListbaseFgs){
super(fm);
mBaseFgList = baseFgs;
}
@Override
public boolean isViewFromObject(View view, Object object){
return false;
}
@Override
public BaseFg getItem(int position){
return mBaseFgList.get(position);
}
@Override
public int getCount(){
return mBaseFgList.size();
}
}
这里很简单,传入一个list的fragment,这里的baseFg是我自定义的一个fragment的基类,然后就是在主页面调用了
mBaseFgList=newArrayList<>();
mBaseFgList.add(newMusicFg());
mBaseFgList.add(newOtherFg());
FragmentManager fm=getSupportFragmentManager();
ViewPagerAdp viewPagerAdp=newViewPagerAdp(fm,mBaseFgList);
mVpMain.setAdapter(viewPagerAdp);
mVpMain.setCurrentItem(0);
mVpMain就是我的ViewPager了,然后,就发现主页面啥都没显示,刚开始以为是我xml是不是对错地方了,或者是ViewPager没找到,就设置了下ViewPager的背景色,发现是有效果的,然后就去看Fragment,但是,通过调试,确实发现那句映射有执行到,而且在返回前通过Toast输出了下信息,是有执行的。捣鼓了好久后,没啥发现,就去看下FragmentPagerAdapter,看是不是有有东西没写好,就看到了isViewFromObject这个函数,平时都没咋管的,突然想到,这里的ViewPager是通过fragment来显示的,那就是Object而不是View了,然后,先设置下返回true,然后,就可以正常了。最后将其设置为里面的两个参数view==object。一切搞定
3.要注意的一点:
//设置viewPager的适配器【注意是activity中嵌套fragment的写法】
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(this.getSupportFragmentManager(), fragments);
如果是在Activity中嵌套Fragment上面的这个写法是正确的,但是如果是在Fragment中嵌套Fragment的话,你如果也是按照上面这样写的话,虽然程序不会出错,但是你会遇到一个小BUG就是,在切换Fragment的时候会出现Fragment不显示的情况。所以fragment里面嵌套fragment在使用,如果用getFragmentManager会出现白板的问题。原因是getFragmentManager是fragment所在父容器的碎片管理,而getChildFragmentManager是fragment所在子容器的碎片管理。如果用getFragmentManager会在viewpager中出现fragment不会加载的情况,所以切换回去就出现了白板。把上面的代码改为以下即可
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getChildFragmentManager(), fragments);
欢迎加入IT怪圈。一个我们自己的圈子。
网友评论