首页 > 解决方案 > Xamarin HybridWebView 从 C# 调用 JS 函数

问题描述

我正在尝试获得一个 HybridWebView,其中 JS 和 C# 代码可以相互通信。我遵循了官方文档,从 JS 调用 C# 代码效果很好。但是我也需要另一种方式,这在提到的教程中没有指导。这是我走了多远:

在我的 HybridWebView 控件中,我添加了以下几行:

public event EventHandler CallJavascript;

public void InvokeJS()
{
    if(CallJavascript != null)
    {
        CallJavascript(this, EventArgs.Empty);
    }
}

在我的自定义渲染器中,我添加了 CallJavascript 方法并将其添加到OnElementChanged()方法中

protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            var webView = new Android.Webkit.WebView(_context);
            webView.Settings.JavaScriptEnabled = true;
            webView.SetWebViewClient(new JavascriptWebViewClient($"javascript: {JavascriptFunction}"));
            SetNativeControl(webView);


        }
        if (e.OldElement != null)
        {
            Control.RemoveJavascriptInterface("jsBridge");
            var hybridWebView = e.OldElement as HybridWebView;
            hybridWebView.Cleanup();

            e.OldElement.CallJavascript += OnElementCallJavascript;
        }
        if (e.NewElement != null)
        {
            Control.AddJavascriptInterface(new JSBridge(this), "jsBridge");
            Control.LoadUrl($"file:///android_asset/Content/{Element.Uri}");
            e.NewElement.CallJavascript += OnElementCallJavascript;
        }
    }


private void OnElementCallJavascript(object sender, EventArgs e)
{
    var webView = new Android.Webkit.WebView(_context);
    Device.BeginInvokeOnMainThread(() =>
    {
        webView.EvaluateJavascript("javascript:increaseCount();", null);
    });
}

但是,我在 OnElementCallJavascript 中获得的 webview 不是我从中调用方法的 WebView,因此不会评估 javascript。任何人都知道我怎么能做到这一点?

标签: c#xamarinxamarin.formsxamarin.androidandroid-webview

解决方案


问题是我正在创建一个新的Android.WebKit.WebView. 像这样使用它解决了这个问题:

Device.BeginInvokeOnMainThread(() =>
{
     Control.EvaluateJavascript("javascript:increaseCount();", null);
});

推荐阅读