美文网首页Android知识Android开发经验谈Android开发
关于fragment和viewpager的切换不显示View问题

关于fragment和viewpager的切换不显示View问题

作者: 770a7122edde | 来源:发表于2017-06-30 14:44 被阅读484次

在做一个项目的时候,遇到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怪圈。一个我们自己的圈子。

相关文章

网友评论

    本文标题:关于fragment和viewpager的切换不显示View问题

    本文链接:https://www.haomeiwen.com/subject/myobcxtx.html