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

.NET Maui Android WebView拦截新窗口点击链接问题求助

.NET Maui Android WebView新窗口链接无响应的解决办法

在.NET Maui Android应用中,WebView加载论坛页面时,点击带有target="_blank"的新窗口链接会无任何反应,且Navigating事件仅触发WebView内部跳转的链接,无法捕获新窗口链接请求。以下是针对Android平台的解决方法:

步骤1:自定义WebChromeClient拦截新窗口请求

Android的WebView默认不处理新窗口打开请求,需要通过重写WebChromeClient的OnCreateWindow方法来捕获这类请求:

public class CustomWebChromeClient : WebChromeClient
{
    private readonly WebView _mainWebView;

    public CustomWebChromeClient(WebView mainWebView)
    {
        _mainWebView = mainWebView;
    }

    public override bool OnCreateWindow(WebView view, bool isDialog, bool isUserGesture, Message resultMsg)
    {
        // 创建新的WebView实例处理新窗口请求
        var newWebView = new WebView(view.Context);
        newWebView.Settings.CopyFrom(view.Settings);
        // 启用JavaScript自动打开窗口和多窗口支持
        newWebView.Settings.JavaScriptCanOpenWindowsAutomatically = true;
        newWebView.Settings.SetSupportMultipleWindows(true);

        // 拦截新WebView的导航事件,自定义处理逻辑
        newWebView.Navigating += (sender, e) =>
        {
            Console.WriteLine("捕获新窗口链接: " + e.Url);
            
            // 方案1:在原WebView中打开新链接,取消新窗口
            _mainWebView.Source = new UrlWebViewSource { Url = e.Url };
            e.Cancel = true;

            // 方案2:调用系统浏览器打开链接(替换上面的方案1代码)
            // var intent = new Android.Content.Intent(Android.Content.Intent.ActionView, Android.Net.Uri.Parse(e.Url));
            // Android.App.Application.Context.StartActivity(intent);
            // e.Cancel = true;
        };

        // 将新WebView绑定到结果消息,完成新窗口初始化
        var transport = (WebView.WebViewTransport)resultMsg.Obj;
        transport.WebView = newWebView;
        resultMsg.SendToTarget();

        return true;
    }
}

步骤2:给WebView设置自定义WebChromeClient

在页面的OnAppearing方法中,针对Android平台给WebView配置上述自定义客户端:

protected override void OnAppearing()
{
    base.OnAppearing();

#if ANDROID
    var androidWebView = BlenderWebview.Handler.PlatformView as Android.Webkit.WebView;
    if (androidWebView != null)
    {
        // 启用多窗口支持
        androidWebView.Settings.SetSupportMultipleWindows(true);
        androidWebView.Settings.JavaScriptCanOpenWindowsAutomatically = true;
        // 绑定自定义WebChromeClient
        androidWebView.SetWebChromeClient(new CustomWebChromeClient(BlenderWebview));
    }
#endif
}

说明

  • 方案1会将新窗口链接加载到原WebView中,保持用户在当前WebView内操作;
  • 方案2会调用系统默认浏览器打开链接,适合需要外部跳转的场景;
  • 确保Android项目已添加INTERNET权限(Maui项目默认已配置)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:08:01