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

Xamarin Forms中无法获取WebView内按钮事件监听回调求助

解决Xamarin Forms安卓WebView触发内部按钮事件的问题

先梳理你现有代码里的核心问题:

  • JavaScript语法不完整:funcurl中的代码未闭合大括号与括号,拼接后的javascript:调用也未完成函数闭合
  • 安卓端执行JS的方式过时:LoadUrl已被EvaluateJavascript替代,后者更安全高效
  • 逻辑偏差:如果你的需求是触发按钮已存在的事件监听器,现有代码是新增监听器,方向不对

以下分两种场景给出修正方案:

场景一:触发WebView内按钮已有的点击事件

如果Web页面中的按钮已经自带点击逻辑,只需从原生代码触发它的点击动作,修改HybridWebViewClient的OnPageFinished方法:

public override async void OnPageFinished(Android.Webkit.WebView view, string url)
{
    base.OnPageFinished(view, url);

    // 等待页面DOM完全就绪
    int retryCount = 10;
    while (view.ContentHeight == 0 && retryCount-- > 0)
    {
        await Task.Delay(1000);
    }

    // 执行JS触发按钮点击
    string triggerScript = @"
        var targetBtn = document.getElementsByClassName('inspectionStartingBtnClose')[0];
        if(targetBtn) {
            targetBtn.click(); // 直接触发按钮原生点击事件
        }";

    // 安卓4.4+推荐用EvaluateJavascript执行JS
    view.EvaluateJavascript(triggerScript, null);
}

场景二:给按钮绑定新事件并与原生功能交互

如果需要给按钮新增点击事件,且点击后调用Xamarin原生功能,需按以下步骤调整:

  1. 定义供JS调用的原生接口类
public class JsNativeBridge : Java.Lang.Object
{
    private readonly Context _context;

    public JsNativeBridge(Context context)
    {
        _context = context;
    }

    // 必须添加该注解,否则JS无法调用此方法
    [Android.Webkit.JavascriptInterface]
    public void ExecuteNativeFunction()
    {
        // 这里写点击按钮后要执行的原生逻辑,比如弹出提示
        Toast.MakeText(_context, "Web按钮触发原生功能", ToastLength.Short).Show();
    }
}
  1. 初始化WebView时注入JS接口
Control.Settings.JavaScriptEnabled = true;
// 注入名为"NativeBridge"的JS接口
Control.AddJavascriptInterface(new JsNativeBridge(mContext), "NativeBridge");
Control.SetWebViewClient(new HybridWebViewClient());
Control.SetWebChromeClient(new MyWebClient(mContext));
Control.LoadUrl(Control.Url);
  1. 修改OnPageFinished中的JS绑定逻辑
public override async void OnPageFinished(Android.Webkit.WebView view, string url)
{
    base.OnPageFinished(view, url);

    int retryCount = 10;
    while (view.ContentHeight == 0 && retryCount-- > 0)
    {
        await Task.Delay(1000);
    }

    // 绑定点击事件并调用原生接口
    string bindScript = @"
        var targetBtn = document.getElementsByClassName('inspectionStartingBtnClose')[0];
        if(targetBtn) {
            targetBtn.addEventListener('click', function() {
                NativeBridge.ExecuteNativeFunction();
            });
            // 如需立即触发点击,可添加:targetBtn.click();
        }";

    view.EvaluateJavascript(bindScript, null);
}

关键注意事项

  • 确保Web页面中按钮的类名inspectionStartingBtnClose拼写完全正确
  • EvaluateJavascript仅支持安卓API 19(4.4)及以上,如需兼容更低版本,可改用view.LoadUrl($"javascript:{bindScript}"),注意转义特殊字符
  • JS接口类和方法必须保持public,且方法需添加[Android.Webkit.JavascriptInterface]注解

内容的提问来源于stack exchange,提问作者I'm Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:12:23