WebViewClient中OnPageFinished访问ProgressBar遇非静态字段错误求助
解决WebViewClient中无法访问ProgressBar的问题
你遇到的问题核心是:嵌套的WebViewClientClass无法直接访问外部类里的非静态ProgressBar实例——错误提示已经说得很明确,非静态字段必须通过对象引用才能调用。下面给你两种实用的解决方案:
方案一:通过构造函数传递ProgressBar引用(推荐)
这是最清晰、低耦合的实现方式,直接把需要操作的ProgressBar实例传递给WebViewClient:
- 改造你的
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; } }
- 在初始化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
相关产品推荐
相关产品推荐

