2014-03-01 4 views
5

Für Xamarin.iOS/Monotouch ist es einfach, eine Zeichenfolge beim Auswerten Javascript abrufen.Wie Android KitKat zu verwenden Evaluieren Sie Javascript in Xamarin.Android/Monodroid und Ergebnis abrufen?

z.B.

string elementValue = browser.EvaluateJavascript("document.getElementById('Id').value"); 

if(elementValue != "") 
{ 
    DoSomething(); 
} 

Kann jemand ein Beispiel dafür geben, wie dies für Xamarin zu tun ist. Android/Monodroid Android kitkat und höher mit Evaluatejavascript()? Speziell wie man/setup IValueCallback Synchron.

+0

möglich Duplikat von [Wie Sie Javascript in Xamarin.Android/Monodroid bewerten und das Ergebnis abrufen?] (Http://stackoverflow.com/questions/22100373/how-to-evaluate-javascript-in-xamarin-android-monodroid-and-retrieve-result) – poupou

+0

@ poupou Ich habe beide Fragen gepostet. Ich bin neu in diesem Bereich. Ursprünglich habe ich gefragt, wie man dies mit loadurl ("javascript: fn") für Android pre-Kitkat und auch mit der Methode evaluatejavascript in Android KitKat erreichen kann. Ich habe es anschließend in zwei Fragen aufgeteilt, so dass die Last für zwei Lösungen nicht auf einer Person lastete. – JakeRanderson86

+0

Bitte löschen Sie eine Ihrer Fragen. –

Antwort

4

Android WebView führt JavaScript asynchron aus und übergibt das Ergebnis der Ausführung später in einem ValueCallback.

Ich bin nicht vertraut mit Xamarin genau, aber wenn Sie etwas von Ihrem Android C# -Code teilen können, kann in der Lage sein, besser zu helfen.

aus einer Java-Perspektive, wo meine Erfahrung liegt:

Im Wesentlichen Sie ein ValueCallback Objekt instanziiert müssen, die die onReceiveValue Funktion implementiert. Wenn das von Ihnen ausgewertete JavaScript fertig ausgeführt wird, wird die von Ihnen angegebene Funktion ausgeführt, wobei das Ergebnis dieser Auswertung als Parameter übergeben wird, der eine Zeichenfolge von JSON ist. Sie sollten dann in der Lage sein, das Ergebnis von diesem JSON abzurufen.

Hoffe, das hilft!

Update: cobbling zusammen einige C#, die helfen könnten. Vorbehalt: Ich habe vorher noch nie eine Zeile C# geschrieben. Aber hoffentlich, wenn es nicht ganz richtig werden Sie auf dem richtigen Weg :-)

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

Dann können Sie vermutlich etwas sagen nach dem Vorbild der

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

Danke für die Antwort. Mein Problem ist, dass ich ValueCallback in ** Monodroid/Xamarin ** nicht instanziieren kann. – JakeRanderson86

+0

OK, ich habe ein paar C# -Proben gelesen und versucht, etwas zusammen zu basteln. Caveat: habe vorher noch kein C# geschrieben, aber hoffentlich werde ich dich in die richtige Richtung bringen :-) Siehe oben die bearbeitete Antwort. – ksasq

+0

Ich habe Ihre JavascriptResult-Klasse aktualisiert, da sie zur Ausführung von Java.Lang.Object eine Unterklasse benötigt. Wenn Sie sich die ursprüngliche Frage ansehen, haben Sie Vorschläge, wie Sie auf den Rückgabewert warten können, bevor Sie mit der nächsten Zeile fortfahren? – JakeRanderson86

9

@ Antwort ksasq ist im Wesentlichen richtig, muss aber einige Kleine Veränderungen.

Stellen Sie zuerst sicher, dass Sie Xamarin Android 4.12 installiert haben, die Bindungen für KitKat hinzufügt.

Dann, da WebView.evaluateJavascript nicht in C# Geschmack gebunden wurde, müssen Sie eine Klasse implementieren IValueCallback. Der schwierige Teil ist, dass die Klasse von Java.Lang.Object geerbt werden muss.

Ein Beispiel für die Klasse wäre wie:

private class MyClass : Java.Lang.Object, IValueCallback 
{ 
    public void OnReceiveValue(Java.Lang.Object value) 
    { 
     //Here goes your implementation. 
    } 
} 
+0

Dank @Aaronhe Ich habe ksasq Antwort mit dem, was Sie sagen, vorher bearbeiten. Haben Sie Vorschläge für synchrone Javascript-Auswertung wie monotouch evaluatejavascript? Ich brauche wirklich eine zuverlässige Methode, um dies zu erreichen. – JakeRanderson86

+0

Dank @Aaronhe es gerettet einen Tag :) –

+0

Dank @Aaronhe .... – susant

Verwandte Themen