J'essaie d'appeler certaines javascript
fonctions assis sur une html
page en cours d'exécution dans un android webview
. Assez simple ce que le code essaie de faire ci-dessous - à partir de l'application Android, appelez une javascript
fonction avec un message de test, qui appelle à son tour une fonction java dans l'application Android qui affiche le message de test via toast.
La javascript
fonction ressemble à:
function testEcho(message){
window.JSInterface.doEchoTest(message);
}
Depuis WebView, j'ai essayé d'appeler les javascript
méthodes suivantes sans succès:
myWebView.loadUrl("javascript:testEcho(Hello World!)");
mWebView.loadUrl("javascript:(function () { " + "testEcho(Hello World!);" + "})()");
J'ai activé javascript
leWebView
myWebView.getSettings().setJavaScriptEnabled(true);
// register class containing methods to be exposed to JavaScript
myWebView.addJavascriptInterface(myJSInterface, "JSInterface");
Et voici la Java
classe
public class JSInterface{
private WebView mAppView;
public JSInterface (WebView appView) {
this.mAppView = appView;
}
public void doEchoTest(String echo){
Toast toast = Toast.makeText(mAppView.getContext(), echo, Toast.LENGTH_SHORT);
toast.show();
}
}
J'ai passé beaucoup de temps à faire des recherches pour voir ce que je fais mal. Tous les exemples que j'ai trouvés utilisent cette approche. Quelqu'un voit-il quelque chose de mal ici?
Edit: Il existe plusieurs autres javascript
fichiers externes référencés et utilisés dans le html
, pourraient-ils être le problème?
la source
@JavascriptInterface
décorateur sur les méthodes Java que vous souhaitez mettre à la disposition de WebView via l'interface JavaScript.myWebView.loadUrl("javascript:testEcho('Hello World!')");
je comprends que vous avez déjà joint le fichier html à cette vue Web. Pourriez-vous me dire comment vous avez fait ça?Réponses:
J'ai compris quel était le problème: des guillemets manquants dans le paramètre testEcho (). C'est ainsi que j'ai reçu l'appel au travail:
la source
À partir de kitkat, utilisez la méthode assessJavascript à la place de loadUrl pour appeler les fonctions javascript comme ci-dessous
la source
loadUrl
a également provoqué l'affichage du clavier logiciel lorsque j'essaie de remplir la valeur dans un champ de saisie.la source
J'ai créé un joli wrapper pour appeler les méthodes JavaScript; il montre également les erreurs JavaScript dans le journal:
Vous devez également ajouter ceci:
Et ajoutez cette interface à votre vue Web:
la source
final Object a = new Object(); callJavaScript(mBrowser, "alert", 1, true, "abc", a);
va céderSyntaxError
avecUnexpected token
qui ne surprend pas quand vous regardez les js générés appeler:javascript:try{alert(,,'abc',,)}catch(error){console.error(error.message);}
callJavaScript(mBrowser, "alert", "abc", "def");
génère une erreur car il y a toujours une virgule escroc à la fin. -1 de moi.callJavascript(mBrowser, "can't do it");
Oui, vous avez l'erreur de syntaxe. Si vous souhaitez obtenir vos erreurs Javascript et imprimer des instructions dans votre logcat, vous devez implémenter la
onConsoleMessage(ConsoleMessage cm)
méthode dans votre WebChromeClient. Il donne les traces de pile complètes comme la console Web (élément Inspect). Voici la méthode.Après la mise en œuvre, vous obtiendrez vos erreurs Javascript et imprimerez les instructions (
console.log
) sur votre logcat.la source
Modification de la réponse @Ilya_Gazman
créera correctement les appels JS, par exemple
Notez que les objets ne seront pas transmis correctement - mais vous pouvez les sérialiser avant de les passer en argument.
J'ai également changé l'emplacement de l'erreur, je l'ai détourné vers le journal de la console qui peut être écouté par:
et client
la source
callJavascript(mBrowser, "can't do it");
:?activity_main.xml
MainActivity.java
fichier d'actifs
la source