多个fragment切换,webview白屏

本文详细解析了一个Activity中多个Fragment加载WebView时,切换后WebView无法重新显示的问题。通过对比replace与switchFragment方法,展示了如何确保Fragment仅实例化一次,避免重复加载导致的WebView显示异常。

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

先说下我的情况我是一个activity 里有四个fragment 然后fragment 加载的是webview,第一次加载会出来,切换到其它fragment的时候,再次切换回来就显示不出来webview;情况类似下面这个小伙伴

https://bbs.youkuaiyun.com/topics/392028670

原因是因为我fragment切换的时候用的是

beginTransaction().replace方法 导致每次切换的时候都会创建一个fragment原代码
 public void replaceViewFragment2(Fragment viewFr, String tag) {
        if (viewFr == currentViewFr) {
            return;
        }
        fargmentManager.beginTransaction().replace(R.id.ill_main, viewFr)
                .commitAllowingStateLoss();
        currentViewFr = viewFr;

        InputMethodManager imm = (InputMethodManager)
                getSystemService(INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindow().getDecorView()
                    .getWindowToken(), 0);
        }
    }

调用方法

 private FragmentManager fargmentManager =this.getSupportFragmentManager();;  
  private void initFragment() {
         Fragment fragment = null;
        if (homeFragment == null)
            homeFragment = new HomeFragment();
        fragment = homeFragment;
        replaceViewFragment2(fragment, fragment.getClass().getName());
 }

修改后代码

//第一步先初始化

    private  Fragment  currentFragment=new Fragment();
//第二部首次启动初始化fragment 
 private void initFragment() {
        Fragment fragment = null;
        if (homeFragment == null)
            homeFragment = new HomeFragment();
        fragment = homeFragment;

        switchFragment(fragment).commit();
//        replaceViewFragment2(fragment, fragment.getClass().getName());
    }
//第三步 封装接口判断是有实例化过得fragment还是已经实例化过得,如果没实例化过就实例化,实例化过得就直接显示,保证每个fragment只实例化一次  ill_main是指你具体的fragment id
private FragmentTransaction switchFragment(Fragment targetFragment){
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (!targetFragment.isAdded()) {
            //第一次使用switchFragment()时currentFragment为null,所以要判断一下
            if (currentFragment != null) {
                transaction.hide(currentFragment);
            }
            transaction.add(R.id.ill_main, targetFragment,targetFragment.getClass().getName());
        }else {
            transaction
                    .hide(currentFragment)
                    .show(targetFragment);


        }
        currentFragment = targetFragment;
        return   transaction;
    }
//第四步 切换tab的时候调用 封装好的方法,记得传入fragment
// 切换tab
    private void changeTabSelect(TabLayout.Tab tab) {
        Fragment fragment = null;
        if (tab.getText().toString().equals("首页")) {
                tab.setIcon(R.mipmap.foot_rhome);
            if (homeFragment == null)
                homeFragment = new HomeFragment();
            fragment = homeFragment;
            switchFragment(fragment).commit();
        }else  if (tab.getText().toString().equals("关注")) {
            tab.setIcon(R.mipmap.foot_rgz);
            if (followFragment == null)
                followFragment = new FollowFragment();
            fragment = followFragment;
            switchFragment(fragment).commit();
        }else if (tab.getText().toString().equals("开奖")) {
            tab.setIcon(R.mipmap.foot_rkj);
            if (lotteryFragment == null)
                lotteryFragment = new LotteryFragment();
            fragment = lotteryFragment;
            switchFragment(fragment).commit();
        }else if (tab.getText().toString().equals("我的")) {
            tab.setIcon(R.mipmap.foot_rmy);
            if (mineFragment == null)
                mineFragment = new MineFragment();
            fragment = mineFragment;
            switchFragment(fragment).commit();
        }
//        replaceViewFragment2(fragment, fragment.getClass().getName());
    }

我是参考了这位大佬的博客,希望能解决你们的问题

https://www.jianshu.com/p/4c5f015b3b6c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值