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

Fragment中WebView添加ProgressBar遇异常:始终显示灰线求助

排查Fragment中WebView搭配ProgressBar出现异常浅灰线的问题

我仔细看了你的代码和描述,那条浅灰线大概率是ProgressBar未被正确控制显示/隐藏导致的,核心问题出在你自定义的MyWebViewClient根本没被用上!

问题1:自定义WebViewClient未绑定到WebView

你在代码里定义了MyWebViewClient,里面写了页面加载开始时显示ProgressBar、加载完成时隐藏的逻辑,但实际给WebView设置的是默认的new WebViewClient(),这就导致你写的控制逻辑完全没触发。ProgressBar一直处于初始状态(比如布局里默认是显示的),那条浅灰线就是它的默认样式残留。

修复步骤

  1. 替换WebViewClient为自定义实现
    把这行代码:
webView.setWebViewClient(new WebViewClient());

改成:

webView.setWebViewClient(new MyWebViewClient());
  1. 确保ProgressBar初始状态为隐藏
    打开你的fragment_home.xml布局文件,给ProgressBar添加初始隐藏属性:
<ProgressBar
    android:id="@+id/progress"
    ...
    android:visibility="gone" />

如果布局里没设置这个属性,ProgressBar会默认显示,即使页面加载完成也不会自动隐藏。

  1. 优化ProgressBar样式(可选但推荐)
    默认的水平ProgressBar在未设置进度时可能会显示一条浅灰线,你可以给它设置明确的样式和进度Drawable来避免这个问题:
<ProgressBar
    android:id="@+id/progress"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:visibility="gone"
    android:progressDrawable="@drawable/custom_progress_bar" />

(你可以自己创建custom_progress_bar.xml来定义进度条的颜色和背景,避免默认样式的灰色残留)

补充优化的代码片段

修改后的onCreateView方法:

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    homeViewModel = ViewModelProviders.of(this).get(HomeViewModel.class);
    View rootView = inflater.inflate(R.layout.fragment_home, container, false);
    Bundle bundle = this.getArguments();
    progressBar = (ProgressBar) rootView.findViewById(R.id.progress);
    // 主动设置初始隐藏,双重保险
    progressBar.setVisibility(View.GONE);
    
    if(bundle != null){
        value = getArguments().getString("Key");
        Log.i("Details",value);
    }
    webView = (WebView) rootView.findViewById(R.id.webView);
    // 绑定自定义WebViewClient
    webView.setWebViewClient(new MyWebViewClient());
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl(value);
    Log.i("Details2",value);
    return rootView;
}

优化后的MyWebViewClient(增加错误处理,避免加载失败时ProgressBar一直显示):

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String value) {
        view.loadUrl(value);
        return true;
    }

    @Override
    public void onPageStarted(final WebView view, final String value, final Bitmap favicon) {
        progressBar.setVisibility(View.VISIBLE);
        progressBar.setProgress(0); // 重置进度,避免上次加载的进度残留
        super.onPageStarted(view, value, favicon);
    }

    @Override
    public void onPageFinished(WebView view, String value) {
        progressBar.setVisibility(View.GONE);
        super.onPageFinished(view, value);
    }

    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        progressBar.setVisibility(View.GONE); // 加载失败也隐藏进度条
        super.onReceivedError(view, errorCode, description, failingUrl);
        // 这里可以添加加载失败的提示逻辑,比如显示错误页面
    }
}

按照上面的步骤修改后,那条浅灰线应该就会消失,ProgressBar也会正常跟随页面加载状态显示/隐藏了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:13:13