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

WebViewClient中OnPageFinished访问ProgressBar遇非静态字段错误求助

解决WebViewClient中无法访问ProgressBar的问题

你遇到的问题核心是:嵌套的WebViewClientClass无法直接访问外部类里的非静态ProgressBar实例——错误提示已经说得很明确,非静态字段必须通过对象引用才能调用。下面给你两种实用的解决方案:

方案一:通过构造函数传递ProgressBar引用(推荐)

这是最清晰、低耦合的实现方式,直接把需要操作的ProgressBar实例传递给WebViewClient:

  1. 改造你的WebViewClientClass,添加构造函数接收ProgressBar:
internal class WebViewClientClass : WebViewClient
{
    private readonly ProgressBar _progressBar;

    // 构造函数接收外部的ProgressBar实例
    public WebViewClientClass(ProgressBar progressBar)
    {
        _progressBar = progressBar;
    }

    public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request)
    {
        Android.Net.Uri url = request.Url;
        view.LoadUrl(url.ToString());
        return true;
    }

    public override void OnPageStarted(WebView view, string url, Bitmap favicon)
    {
        base.OnPageStarted(view, url, favicon);
        Log.Info("101028", "loading started");
        // 页面开始加载时显示进度条
        _progressBar.Visibility = ViewState.Visible;
    }

    public override void OnPageFinished(WebView view, string url)
    {
        base.OnPageFinished(view, url);
        Log.Info("101028", "loading finished");
        // 现在可以正常控制ProgressBar了
        _progressBar.Visibility = ViewState.Gone;
    }
}
  1. 在初始化WebView时,把你的PB实例传入WebViewClient的构造函数:
webView.Settings.JavaScriptEnabled = true;
webView.Settings.LoadWithOverviewMode = true;
webView.Settings.UseWideViewPort = true;
// 传入ProgressBar实例
webView.SetWebViewClient(new WebViewClientClass(PB));
webView.LoadDataWithBaseURL("file:///android_asset/", HTML_DATA, "text/html", "UTF-8", null);

方案二:通过外部类实例访问(不推荐,耦合性高)

如果你的WebViewClientClass是嵌套在Activity(比如MainActivity)中的非静态内部类,也可以通过强制转换上下文来获取外部Activity实例,进而访问ProgressBar:

public override void OnPageFinished(WebView view, string url)
{
    base.OnPageFinished(view, url);
    Log.Info("101028", "loading finished");
    // 假设你的宿主Activity是MainActivity,强制转换上下文
    var hostActivity = (MainActivity)view.Context;
    hostActivity.PB.Visibility = ViewState.Gone;
}

这种方法虽然能快速解决问题,但会让WebViewClient和Activity紧密绑定,后续修改或维护时容易出问题,所以更推荐第一种方案。

最后提醒:确保你的PB已经通过FindViewById正确初始化,避免出现空引用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:25