Звоните JavaScript функция в Xamarin - PullRequest
1 голос
/ 28 февраля 2020

Как я могу вызвать JavaScript метод в Xamarin ?. Я нашел для этого библиотеку (https://github.com/chkn/HybridKit), но, к сожалению, этот инструмент может вызывать функцию C# в JavaScript. Для Xamarin.Forms я нашел одно решение https://docs.microsoft.com/en-au/xamarin/xamarin-forms/app-fundamentals/custom-renderer/hybridwebview

1 Ответ

0 голосов
/ 02 марта 2020

Вы можете вызвать html JavaScript функцию в C#, если да, вы можете посмотреть:

Есть индекс. html, добавлено в PCL, настройка Build Action как EmbeeddedResource, есть одна функция с именем printMultiplicationTable

<html>
<body>
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<div id='multiplicationtable'></div>
<script type="text/javascript">
    function printMultiplicationTable(num, stop)
{
var number = parseInt(num);
var stopNumber = parseInt(stop);

$('#multiplicationtable').empty();
for (var index = 1; index <= stopNumber; index++) {
    $('#multiplicationtable').append(number + ' x ' + index + " = " + number * index + '<br/>');
}
}</script>
</body>
</html>

Теперь вы хотите вызвать эту JavaScript функцию в C#,

<StackLayout>
    <Label
        FontSize="Medium"
        HorizontalOptions="Center"
        Text="Multiplication Table" />
    <StackLayout HorizontalOptions="Center" Orientation="Horizontal">
        <Label Text="Number: " VerticalOptions="Center" />
        <Entry
            x:Name="numberEntry"
            Text="5"
            WidthRequest="40" />
        <Label Text="Stop:" VerticalOptions="Center" />
        <Entry
            x:Name="stopEntry"
            Text="10"
            WidthRequest="40" />
    </StackLayout>
    <Button
        x:Name="callJavaScriptButton"
        Clicked="OnCallJavaScriptButtonClicked"
        Text="Call JavaScript" />
    <WebView
        x:Name="webView"
        HorizontalOptions="FillAndExpand"
        VerticalOptions="FillAndExpand" />
</StackLayout>

 public MainPage()
    {
        InitializeComponent();
        webView.Source = LoadHTMLFileFromResource();
    }
    HtmlWebViewSource LoadHTMLFileFromResource()
    {
        var source = new HtmlWebViewSource();

        // Load the HTML file embedded as a resource in the PCL
        var assembly = typeof(MainPage).GetTypeInfo().Assembly;
        var stream = assembly.GetManifestResourceStream("CallJavaScript.index.html");
        using (var reader = new StreamReader(stream))
        {
            source.Html = reader.ReadToEnd();
        }
        return source;
    }

    private void OnCallJavaScriptButtonClicked(object sender, EventArgs e)
    {
        if (string.IsNullOrWhiteSpace(numberEntry.Text) || string.IsNullOrWhiteSpace(stopEntry.Text))
        {
            return;
        }

        int number = int.Parse(numberEntry.Text);
        int end = int.Parse(stopEntry.Text);

        webView.Eval(string.Format("printMultiplicationTable({0}, {1})", number, end));
    }

Это мой образец, вы можете получить его с github:

https://github.com/CherryBu/CallJavaScript

Обновление:

enter image description here

Обновите снова:

Если вы хотите вызвать функцию html JavaScript из C#, вы можете настроить веб-просмотр в MainActivity .cs: ​​

  WebSettings settings = webview1.Settings;
        settings.JavaScriptEnabled = true;
        // load the javascript interface method to call the foreground method
        //webview1.AddJavascriptInterface(new MyJSInterface(this), "CSharp");
        webview1.SetWebViewClient(new WebViewClient());        
        webview1.LoadUrl("file:///android_asset/login.html");

Пожалуйста, добавьте файл html в папку Assets и установите BuildAction как AndroidAsset.

Затем C# вызывает метод в JS и получает значение обратного вызова

class EvaluateBack : Java.Lang.Object, IValueCallback
{

    public void OnReceiveValue(Object value)
    {

        Toast.MakeText(Android.App.Application.Context,value.ToString(), ToastLength.Short).Show();// you will get the value "100"
    }


}

webview1.EvaluateJavascript("javascript: check();", new EvaluateBack());

Это пример на github, на который вы можете посмотреть:

https://github.com/CherryBu/CallJavaFunction

...