2013-03-07 3 views
1

Je sais que cette question a été posée plusieurs fois et j'ai vérifié toutes les solutions et j'ai tout étudié. Cependant, cela ne fonctionne tout simplement pas pour moi.Appel de la fonction JavaScript dans WebView

Je ne sais pas ce que je fais mal. Quelqu'un peut-il m'aider s'il vous plaît?

Je suis le chargement d'un fichier HTML local dans mon WebView puis d'appeler la fonction JavaScript:

wv.loadUrl("file:///android_asset/sample.html"); 
wv.getSettings().setJavaScriptEnabled(true); 
JavascriptInterface javasriptInterface = new JavascriptInterface(MyActivity.this); 
wv.addJavascriptInterface(javasriptInterface, "MyInterface"); 
wv.loadUrl("javascript:loadpath()"); 

Le fichier HTML est:

<html> 
<head> 
</head> 

<body> 
<script type="text/javascript"> 
    function callDoSomething() { 
     // Do something 
    } 

    function loadpath() { 
     // Is not called no matter whatever operation I do here. Just printing a string, setting variable, android callback anything. 
     document.write("Hi"); 
     document.getElementById('img').src = "path.png"; 
    } 
</script> 

<form name="myForm" action="FORM"> 
    <img src="" alt="Autofill" /><br> 
    <input type="button" value="Submit" onClick="callDoSomething()" /> 
</form> 

</body> 
</html> 

Répondre

6

loadUrl() est asynchrone. Vous appelez votre deuxième loadUrl()façon trop tôt. Vous devez attendre que votre page soit chargée, peut-être en utilisant un WebViewClient et en regardant onPageFinished().

+0

Oh! Merci pour cette info .. En fait, mon exigence est de passer un paramètre à la page HTML. Au début, j'ai essayé des requêtes de chaîne dans le premier chemin loadUrl. Cependant, il donnait une page Web introuvable erreur et après la recherche trouvé cette méthode. Quoi qu'il en soit, je vais essayer d'implémenter onPageFinished() avec un WebViewClient. Merci beaucoup! – Rachit

+0

@Rachit: Oui, vous ne pouvez pas utiliser les paramètres de requête sur les chemins locaux, uniquement les URL Web. Cependant, gardez à l'esprit que votre code JavaScript peut rappeler dans votre application pour récupérer ces données, via les méthodes que vous exposez sur 'JavascriptInterface' et que votre script récupère via des appels sur' MyInterface'. Vous n'avez pas besoin d'appeler 'loadUrl()' une deuxième fois - demandez au script * d'extraire * les données, plutôt que de pousser les données. – CommonsWare

+0

Oui, je n'avais pas pensé à ça. Mais la performance sage, quelle méthode serait plus rapide? Chacun d'entre eux devrait être ok pour un seul paramètre. Cependant, si je dois échanger plusieurs paramètres à différents moments, y a-t-il un compromis? – Rachit