2015-10-09 17 views
5

Sto sviluppando un'applicazione che utilizza Xamarin Android con una visualizzazione Web che visualizza una pagina Web. Voglio implementare una comunicazione bidirezionale tra Javascript da WebView a C#. Potrei chiamare C# da Javascript usando questo link. Tuttavia non sono riuscito a trovare un modo per inviare dati da C# a Javascript. C'è un modo per inviare dati avanti e indietro in questo approccio. Pensavo che scrivere una callback in Javascript avrebbe funzionato, ma come farla sparare dal codice C#.Xamarin Comunicazione Android bidirezionale tra Javascript e C#

Ora, il mio problema è come chiamare WebView da una classe di interfaccia javascript. Ho una classe di interfaccia Javascript come menzionato https://developer.xamarin.com/recipes/android/controls/webview/call_csharp_from_javascript/ namespace ScannerAndroid { public class JSInterface: Java.Lang.Object { Contesto di contesto; WebView WebView;

public JSInterface (Context context, WebView webView1) 
    { 
     this.context = context; 
     this.webView = webView1; 
    } 

    [Export] 
    [JavascriptInterface] 
    public void ShowToast() 
    { 
     Toast.MakeText (context, "Hello from C#", ToastLength.Short).Show(); 
     this.webView.LoadUrl ("javascript:callback('Hello from Android Native');"); 

    } 
    } 
} 

Il codice genera un'eccezione nella riga LoadUrl. java.lang.Throwable: è stato chiamato un metodo WebView sul thread 'Thread-891'. Tutti i metodi WebView devono essere richiamati sullo stesso thread. (Previsto Looper Looper (main, tid 1) {42ce58a0} chiamato su null, FYI main Looper è Looper (main, tid 1) {42ce58a0})

Ora sto lottando su come fare riferimento a WebView da questa interfaccia di script Java classe

+0

Possibile duplicato di [Chiamare JavaScript funzioni JavaScript in WebView] (http://stackoverflow.com/questions/4325639/android-calling-javascript-functions-in-webview) – Cheesebaron

risposta

2

Sì. Questo è possibile. Se ci si rivolge KitKat o superiore è possibile utilizzare:

webView.EvaluateJavascript("enable();", null); 

Dove in questo caso enable(); è una funzione JS.

Se si prendono di mira i livelli di API più bassi è possibile utilizzare LoadUrl();:

webView.LoadUrl("javascript:enable();"); 

EDIT:

L'errore che si ottiene in cui si lamenta il LoadUrl è perché per qualche ragione si verifica su un non -UI thread.

Dal momento che avete già superato il Context nella tua classe JavascriptInterface, allora si può semplicemente avvolgere il contenuto di ShowToast in:

context.RunOnUiThread(() => { 
    // stuff here 
}); 

Basta cambiare firma Context-Activity e dovrebbe aiutare a marshalling indietro sul thread dell'interfaccia utente.

+0

Il mio problema è chi chiamare WebView da un javascript classe di interfaccia. Ho una classe di interfaccia Javascript come menzionato https://developer.xamarin.com/recipes/android/controls/webview/call_csharp_from_javascript/ – User382

+0

Non capisco cosa sia "come chiamare WebView dalla classe di interfaccia javascript". Cosa intendi? – Cheesebaron

+0

Cheesebaron per favore vedi dettagli sotto. – User382

Problemi correlati