You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android:Fragment中WebView的ProgressBar不显示问题求助

解决WebView加载前空白、ProgressBar不显示的问题

嘿,我帮你梳理下问题的根源,然后一步步解决:

1. 最核心的问题:ProgressBar被WebView挡住了

看你的布局代码,用的是RelativeLayout,而WebView是在ProgressBar之后声明的——在RelativeLayout里,后声明的View层级更高,会完全覆盖在前面的View上面,所以你的ProgressBar其实一直存在,但被WebView完全挡住了,根本看不到!

解决这个的最佳方式是换成FrameLayout(这种上下覆盖的场景用FrameLayout最顺手),调整布局如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FragmentThree">

    <!-- 底层放WebView -->
    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- 上层放进度条,默认显示在顶部 -->
    <ProgressBar
        android:id="@+id/progressbar"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top" />
</FrameLayout>

我把进度条改成了水平样式,这样用户能直观看到加载进度,如果你偏好圆形进度条,把style改回原来的就行,记得调整布局位置让它居中。

2. 完善ProgressBar的显示/隐藏逻辑

你只给进度条设置了进度值,但没处理它的显示状态:加载开始时要显示,加载完成后要隐藏。同时给WebView加一些基础配置,加快加载速度,减少空白时间:

private void initMain(View view) {
    webView = view.findViewById(R.id.webview);
    progressBar = view.findViewById(R.id.progressbar);
    progressBar.setMax(100);
    // 一开始先显示进度条
    progressBar.setVisibility(View.VISIBLE);

    // 配置WebView,优化加载体验
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true); // 大部分现代网页依赖JS
    webSettings.setDomStorageEnabled(true);
    webSettings.setLoadWithOverviewMode(true);
    webSettings.setUseWideViewPort(true);
    webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); // 开启缓存,重复加载更快

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            // 页面开始加载时显示进度条
            progressBar.setVisibility(View.VISIBLE);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            // 页面加载完成后隐藏进度条
            progressBar.setVisibility(View.GONE);
        }
    });

    webView.setWebChromeClient(new WebChromeClient(){
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
            progressBar.setProgress(newProgress);
            // 保险起见,进度到100也隐藏进度条
            if(newProgress == 100){
                progressBar.setVisibility(View.GONE);
            }
        }
    });

    webView.loadUrl(URL);
}

3. 修复Fragment的参数传递问题(隐藏坑)

你现在的Fragment用了带参构造函数,这在Android里是不推荐的——当Fragment因为配置变化(比如旋转屏幕)重建时,系统会调用无参构造,你的URL参数会丢失,导致WebView加载失败。换成静态工厂方法的方式更安全:

// 删掉原来的带参构造,换成静态工厂方法
public static FragmentThree newInstance(String url) {
    FragmentThree fragment = new FragmentThree();
    Bundle args = new Bundle();
    args.putString("WEB_URL", url);
    fragment.setArguments(args);
    return fragment;
}

// 保留无参构造
public FragmentThree() {
    // Required empty public constructor
}

// 在onCreateView里获取参数
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_three, container, false);
    // 从Bundle里取URL
    if (getArguments() != null) {
        URL = getArguments().getString("WEB_URL");
    }
    initMain(view);
    return view;
}

4. 减少进入Fragment时的空白时间

如果还是觉得空白时间长,可以给WebView设置一个默认背景色,或者在加载前显示一个占位布局,比如和APP主题一致的背景,让用户感觉不是“卡了”。

内容的提问来源于stack exchange,提问作者digdigdoot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:29:54