如何将Xamarin.Forms中WebView的Navigated方法转为Xamarin.Android等效实现?
我来帮你搞定Xamarin.Android里对应Xamarin.Forms WebView Navigated事件的实现,你选OnPageFinished方向是对的,但大概率是配置环节没做对导致没生效,咱们一步步来调整:
1. 先明确对应关系
Xamarin.Forms里的Navigated事件(页面加载完成后触发),在Android原生WebView里对应的就是WebViewClient类的OnPageFinished方法——你找的点没错,只是需要把这个自定义的客户端绑定到WebView上才行。
2. 正确的实现步骤
首先,创建一个自定义的WebViewClient子类,把你的业务逻辑写在重写的OnPageFinished里:
public class CustomWebViewClient : WebViewClient { private readonly YourActivity _hostActivity; // 传递宿主Activity,方便调用页面里的对象(比如你的paynetz实例) public CustomWebViewClient(YourActivity activity) { _hostActivity = activity; } public override void OnPageFinished(Android.Webkit.WebView view, string url) { base.OnPageFinished(view, url); System.Diagnostics.Debug.WriteLine("Page url=>" + url); // 你的原有逻辑,这里注意上下文的调用 if (url.Contains(Paynetz.model.PaynetzConfig.GetResponseExpression())) { var result = _hostActivity.paynetz.ValidateResponse(); view.GoBack(); } } }
然后在你的Activity中,找到原生WebView控件,把这个自定义客户端绑定上去,同时做基础配置:
// 替换成你布局里WebView的实际ID var nativeWebView = FindViewById<Android.Webkit.WebView>(Resource.Id.webView); // 绑定自定义WebViewClient,这一步是关键! nativeWebView.SetWebViewClient(new CustomWebViewClient(this)); // 如果你的网页需要JS支持,别忘了开启 nativeWebView.Settings.JavaScriptEnabled = true;
3. 排查你之前代码无效的原因
你之前的代码没生效,最可能的原因就是没把自定义的WebViewClient设置给WebView——默认的WebView用的是系统自带的WebViewClient,不会触发你重写的OnPageFinished。另外还要注意这几点:
- 确认
PaynetzConfig.GetResponseExpression()返回的字符串能正确匹配目标URL,避免因为字符串不匹配导致逻辑没触发 - 页面如果有重定向,
OnPageFinished会被多次调用,你可以加个标记位避免重复执行逻辑 - 别搞混
WebViewClient和WebChromeClient:后者主要处理JS弹窗、页面进度这些,页面加载完成的逻辑还是要放在WebViewClient里
4. 额外补充
如果还需要对应Forms里的Navigating事件(页面开始加载前触发),Android端对应的是WebViewClient的ShouldOverrideUrlLoading方法,你可以按需重写它来做拦截或预处理。
内容的提问来源于stack exchange,提问作者Arvind Chourasiya
相关产品推荐
相关产品推荐

