Xamarin HybridWebView вызывает функцию JS из C # - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь получить HybridWebView, где код JS и C # могут общаться друг с другом. Я следовал официальным документам , и он прекрасно работает для вызова кода C # из JS. Тем не менее, мне нужен и другой путь, который не описан в упомянутом руководстве. Вот как далеко я получил:

В моем контроллере 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, из которого я вызываю метод, поэтому никакой javascript не оценивается. Кто-нибудь понял, как я могу этого достичь?

1 Ответ

0 голосов
/ 09 мая 2019

Проблема заключалась в том, что я создавал новый Android.WebKit.WebView. Использование этого, как это решило проблему:

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