Как использовать Android KitKat EvaluateJavascript в Xamarin.Android/Monodroid и получить результат?

Для Xamarin.iOS / Monotouch просто получить строку при оценке javascript .

например

string elementValue = browser.EvaluateJavascript("document.getElementById('Id').value"); if(elementValue != "") { DoSomething(); } 

Может ли кто-нибудь привести пример того, как это сделать для Xamarin. Android / Monodroid Android kitkat и выше, используя Evaluatejavascript ()? В частности, как использовать / настроить IValueCallback синхронно .

Android WebView выполняет асинхронный JavaScript и передает результат выполнения в ValueCallback позже.

Я точно не знаком с Xamarin, но если вы можете поделиться некоторыми из своих кодов на Android C #, может быть лучше.

С точки зрения Java, где мой опыт:

По сути, вам нужно создать экземпляр объекта ValueCallback, который реализует функцию onReceiveValue . Когда обработанный javascript завершает выполнение, объявленная вами функция будет выполнена, передавая результат этой оценки в качестве параметра, который является строкой JSON. Затем вы сможете получить результат из этого JSON.

Надеюсь это поможет!

Обновление: объединить некоторые C #, которые могут помочь. Caveat: Я никогда не писал строки c # до этого. Но, надеюсь, если это не совсем правильно, вы станете на правильном пути 🙂

 class JavaScriptResult : public IValueCallback { public void OnReceiveValue(Java.Lang.Object result) { Java.Lang.String json = (Java.Lang.String) result; // |json| is a string of JSON containing the result of your evaluation } } 

Тогда вы, вероятно, можете сказать что-то вроде

 web_view.EvaluateJavaScript("function() { alert('hello world'); return 42; }()", new JavaScriptResult()); 

Ответ @ ksasq по существу правильный, но требует небольших изменений.

Прежде всего, убедитесь, что у вас установлен Xamarin Android 4.12, который добавляет привязки для KitKat.

Затем, поскольку WebView.evaluateJavascript не был связан с приложением C #, вам необходимо создать класс, реализующий IValueCallback . Сложная часть состоит в том, что класс должен быть унаследован от Java.Lang.Object .

Пример этого класса будет выглядеть следующим образом:

 private class MyClass : Java.Lang.Object, IValueCallback { public void OnReceiveValue(Java.Lang.Object value) { //Here goes your implementation. } } 
Intereting Posts
Android: видео можно воспроизводить из галереи, но когда я воспроизвожу его с помощью видеоролика Intent.ACTION_VIEW, не могу играть Как загрузить собственный общий объект в банке из приложения Android? Как полностью предотвратить прокрутку TextView? Ошибка «Тип возврата int не совместим с Intent» при использовании класса FirebaseMessagingService Android добавит мое приложение в кнопку «Поделиться» в галерее Как отображать прозрачную активность по другому действию без удаления предыдущей активности Как я могу проверить фильтрацию на Android Маркете перед публикацией моего приложения? Как изменить цвет разделителя в NavigationView? Проблема разработки android ndk: ошибка «Недопустимые аргументы» для функции memcpy Как использовать -assumenosideeffects класс android.util.Log в моем приложении Android: сохранение состояния во время жизненного цикла Android Awareness API – Тип дома Использовать атрибут android: padding Модернизация 2.0 как удалить? Выпустить Android-камеру без перезагрузки?