关于Fragment切换界面空白那些事

本文探讨了在使用FragmentTransaction进行Fragment切换时遇到的界面空白问题。通过调整Fragment的管理方式,如采用FragmentStatePagerAdapter和正确处理onCreateView方法,有效解决了界面空白及子Fragment显示异常的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于Fragment切换界面空白那些事

楼主在做一个类似主界面于网易新闻的demo
主界面下方为5个父Fragment,Fragment之间的切换用FragmentTransaction
第一,第二个父界面分别为fragment+viewpager选项卡那种界面

页面大概是这样
这里写图片描述

问题来了…….
我在开发到第二个父界面时(第二个父界面与第一个类似),程序第一个加载为第一个父界面,第一个界面显示正常,但是切换到第二个界面时,界面为空白,上方选项卡切换之后界面依然空白

这里写图片描述

我是这样处理父Fragment之间的切换的

 private void initFragment(int index) {
        // 由于是引用了V4包下的Fragment,所以这里的管理器要用getSupportFragmentManager获取
        if (index == currentPage) {
            return;
        }
        // 开启事务
        FragmentTransaction transaction = mFragmentManager.beginTransaction();
        // 隐藏所有Fragment
//        hideFragment(transaction);
        if (currentPage != -1) {
            switch (currentPage) {
                case 0:
                    if (mMainHomePageFragment != null) {
                        transaction.hide(mMainHomePageFragment);
                    }
                    break;
                case 1:
                    if (mMainRankPageFragment != null) {
                        transaction.hide(mMainRankPageFragment);
                    }
                    break;
                case 2:
                    if (mMainClassifyPageFragment != null) {
                        transaction.hide(mMainClassifyPageFragment);
                    }
                case 3:
                    if (mMainHomePageFragment != null) {
                        transaction.hide(mMainHomePageFragment);
                    }
                    break;

            }
        }

        switch (index) {
            case BOTTOM_ITEM_TITLE_HOME_INDEX:
                currentPage = 0;
                if (mMainHomePageFragment == null) {
                    mMainHomePageFragment = new MainHomePageFragment();
                    transaction.add(R.id.fl_content, mMainHomePageFragment);
                } else {
                    transaction.show(mMainHomePageFragment);
                }
                break;
            case BOTTOM_ITEM_TITLE_RANK_INDEX:
                currentPage = 1;
                if (mMainRankPageFragment == null) {
                    mMainRankPageFragment = new MainRankPageFragment();
                    transaction.add(R.id.fl_content, mMainRankPageFragment);
                } else {
                    transaction.show(mMainRankPageFragment);

                }

                break;
                }
      }

主Fragment的切换处理的这样:每个父Fragment显示时,如果是第一次,transaction是add添加,并且保存为成员变量,如果已经有该成员变量,则是调用ttransaction.show
父Fragment切换的时候是先隐藏之前显示的,再显示或添加新的Fragment
这样处理看上去没什么问题(楼主至今都不知道有什么不妥)

经过一番捣鼓之后,还是不知道问题出在哪,我就试着每次切换的时候,把之前的Fragment都remove掉,每次都是add操作,这样刚刚的那个问题就解决掉了

 private void initFragment(int index) {
        // 由于是引用了V4包下的Fragment,所以这里的管理器要用getSupportFragmentManager获取
        if (index == currentPage) {
            return;
        }
        // 开启事务
        FragmentTransaction transaction = mFragmentManager.beginTransaction();
        // 隐藏所有Fragment
//        hideFragment(transaction);
        if (currentPage != -1) {
            switch (currentPage) {
                case 0:
                    if (mMainHomePageFragment != null) {
                        transaction.remove(mMainHomePageFragment);
                    }
                    break;
                case 1:
                    if (mMainRankPageFragment != null) {
                        transaction.remove(mMainRankPageFragment);
                    }
                    break;
                case 2:
                    if (mMainClassifyPageFragment != null) {
                        transaction.remove(mMainClassifyPageFragment);
                    }
                case 3:
                    if (mMainHomePageFragment != null) {
                        transaction.remove(mMainHomePageFragment);
                    }
                    break;

            }
        }

        switch (index) {
            case BOTTOM_ITEM_TITLE_HOME_INDEX:
                currentPage = 0;
                if (mMainHomePageFragment == null) {
                    mMainHomePageFragment = new MainHomePageFragment();
                }
                transaction.add(R.id.fl_content, mMainHomePageFragment);
                break;
            case BOTTOM_ITEM_TITLE_RANK_INDEX:
                currentPage = 1;
                if (mMainRankPageFragment == null) {
                    mMainRankPageFragment = new MainRankPageFragment();
                }
                transaction.add(R.id.fl_content, mMainRankPageFragment);
                break;

但是这应该不是最好的解决办法,虽然父Fragment的实例没有被销毁,但是父Fragment切换的时候视图层都需要重新绘制(请各位大神看看有没有更好的解决上面那个问题的办法)

紧接着第二个问题出现了,第一个父Fragment之间的切换时,每个父Fragment的子Fragment都是可以显示的,但是父Fragment多切换
几次之后有些子Fragment变成空白页,这种问题就比较常见了,主要是有两个原因:
1.每次切换Fragment时都会调用Fragment的Fragment的oncreateView方法
将视图存为成员变量,调用父界面清除之前视图即可
(记得是不仅是每个父Fragment都要这样操作,每个父Fragment的每个子Fragment的oncreateView方法也要这么操作)
这里写图片描述

2.楼主的每个fragmen都有很多个tab,切换的时候有时会变为空白,viewpager的适配器需要继承FragmentStatePagerAdapter而非FragmentPagerAdapter(区别可以百度,这里就不说了)
这里写图片描述

这样Fragment切换变空白问题就解决了,但是还是有个不完美的地方,希望各位大神看到能帮我解决下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值