美文网首页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