Как запустить функцию Java Script и получить отдачу в Android?

Я работаю над проектом на Xamarin C#, и у меня проблемы с запуском Java Script. Есть ли в настоящее время способ вызвать определенную функцию JS и получить ее возвращаемое значение?

Я знаю, что JS можно запускать в WebView; однако как я могу получить результат?

На данный момент JS поступает по ссылке на моем сайте. Любая помощь будет очень высоко ценится!


РЕДАКТИРОВАТЬ

Вот код, который я пробовал:

MyView.axml

 <android.webkit.WebView
            android:id = "@+id/web_view"
            android:layout_width = "match_parent"
            android:layout_height = "0dp"
            local:layout_constraintTop_toBottomOf = "@+id/pause"
            local:layout_constraintBottom_toBottomOf = "parent"/>

MyView.cs

позвонил в protected override void OnCreate

webView.Settings.JavaScriptEnabled = true;
webView.SetWebViewClient(new MyWebViewClient());
webView.LoadUrl("http://www.example.com/scheduleV5.js");

MyWebViewClient (класс)

public class MyWebViewClient : WebViewClient
{
    public override void OnPageFinished(WebView view, String url)
    {
        view.EvaluateJavascript("javascript: getSchedule();", new EvaluateBack());
    }
}

EvaluateBack (класс)

public class EvaluateBack : Java.Lang.Object, IValueCallback
{

    public void OnReceiveValue(Java.Lang.Object value)
    {
        Toast.MakeText(Android.App.Application.Context, value.ToString(), ToastLength.Short).Show();// you will get the value "100"
        var test = value.ToString();
    }
}

могло это сработать?

Leo Zhu - MSFT 10.01.2019 06:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
582
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ты мог бы сделать это

Js вызывает методы в C#

Настройте метод OnCreate в Activity:

var webview = FindViewById<WebView>(Resource.Id.webView1);
WebSettings settings = webview.Settings;
settings.JavaScriptEnabled = true;
// load the javascript interface method to call the foreground method
webView.AddJavascriptInterface(new MyJSInterface(this), "CSharp");
webview.SetWebViewClient(new WebViewClient());

Создайте класс C# :

class MyJSInterface : Java.Lang.Object
  {
    Context context;

  public MyJSInterface (Context context)
    {
      this.context = context;
    }

  [JavascriptInterface]
  [Export]
  public void ShowToast (string msg)
    {
      Toast.MakeText(context, msg, ToastLength.Short).Show();
    }
  }

А потом это вызывается в JS :

<button type = "button" onClick = "CSharp.ShowToast ('Call C#')">Call C#</button>

Вы можете обратиться к этому документу : https://github.com/xamarin/recipes/tree/master/Recipes/android/controls/webview/call_csharp_from_javascript

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

webView.EvaluateJavascript("javascript: callJS();", new EvaluateBack());

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"
        }
    }

в JS:

<script>
      function callJS(){
        return 100;
      }
</script>

это могло бы вам помочь?

Leo Zhu - MSFT 07.01.2019 08:16

Я могу немного запутаться, вы хотите вызвать метод JS в C# и получить значение обратного вызова? Если да, обратитесь ко второму обновленному мной методу.

Leo Zhu - MSFT 07.01.2019 11:00

Идеально! второй метод - это то, что я ищу. Я попробую и дам вам знать.

Scout 43 07.01.2019 13:53

Я продолжаю получать нулевое возвращаемое значение. Просто для пояснения звоню: webView.LoadUrl("http://mywebsite.com/file.js"); , а затем оцениваю скрипт?

Scout 43 10.01.2019 18:36

Вы можете настроить «WebViewClient», а затем вызвать «webview.evaluatescript» в «OnPageFinished»

Leo Zhu - MSFT 11.01.2019 02:38

По-прежнему появляется null ... я обновлю сообщение с кодом, который я пробовал завтра.

Scout 43 15.01.2019 00:39

Починил это! Пришлось использовать ссылку на html-страницу, на которой использовался java-скрипт, вместо прямой ссылки на файл. Спасибо за вашу помощь!

Scout 43 15.01.2019 05:54

Другие вопросы по теме