Détecter cliquez sur le bouton HTML via javascript dans Android WebView

Je ne suis pas très familier avec javascript mais je pense que c'est la meilleure façon d'Accomplir mon but. Si non, merci de me corriger.

J'ai un texte de licence 2 boutons à la fin. Tout cela est écrit en HTML dans un WebView car il y a des liens dans la licence. Maintenant, je veux que lorsque l'utilisateur clique sur le bouton" ok " dans le WebView, cela déclenche un javascript ou un écouteur que je peux saisir en Java pour déclencher un Intent pour aller de l'avant dans l'application. (Le bouton Annuler ferait le en face, mais si je sais faire un, je peux faire l'autre. ;) )

Est-ce que ça sonne quelque chose pour quelqu'un? Toute explication ou Exemple de code est la bienvenue.

35
demandé sur Sathya 2010-11-01 00:48:04

4 réponses

Je l'ai finalement eu par moi-même après quelques lectures. Un peu dur quand vous ne savez rien sur javascript et quand le doc est assez mince sur le sujet.
Voici ma solution, j'espère que cela aidera les autres:

Avec une page HTML contenant 2 boutons à la fin comme ça:

<div>
     <button type="button" id="ok" style="font-weight: 700; margin-right: 20px;" onclick="validClick();">J'accepte</button>
     <button type="button" id="no" onclick="refuseClick();">Je refuse</button>
</div>

J'envoie l'Événement du clic au javascript en haut de ma page HTML:

<script language="javascript">

   function validClick()
   {
      valid.performClick();
      document.getElementById("ok").value = "J'accepte";
   }
   function refuseClick()
   {
      refuse.performClick();
      document.getElementById("no").value = "Je refuse";
   }

</script>

valid et refuse sont 2 objets java que j'ai passés à travers l'interface javascript pour utiliser leur méthode. Donc, en java, j'ai créé 2 boutons (pas vraiment affichés dans l'Activité, seulement ici pour leurs méthodes et sont en quelque sorte des ombres des boutons HTML:

valid = new Button(ctx);
valid.setOnClickListener(this);
refuse = new Button(ctx);
refuse.setOnClickListener(this);

Ensuite, j'ai ajouté javascript à mon WebView:

// Enablejavascript
WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
// Add the interface to record javascript events
wv.addJavascriptInterface(valid, "valid");
wv.addJavascriptInterface(refuse, "refuse");

Et enfin, gérez les événements click dans la méthode onClick:

@Override
public void onClick(View v) {
    if (v.equals(valid)) {
        //do Something
    } else if (v.equals(refuse)) {
        //do Something else }
}

Espère que cela aidera certaines personnes

58
répondu Sephy 2014-05-13 05:51:28

Voici une solution plus simple. Du côté Java, créez un écouteur pour chaque bouton. Il n'a pas besoin d'être une classe particulière, car la méthode sera recherchée en utilisant reflection:

WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
wv.addJavascriptInterface(new Object()
{
  public void performClick()
  {
    // Deal with a click on the OK button
  }
}, "ok");

Ensuite, dans le HTML, appelez-le directement à partir de la balise de bouton:

<button type="button" onclick="ok.performClick();">OK</button>
38
répondu peastman 2011-09-11 18:42:37

Dans le cas où vous souhaitez également récupérer la valeur du bouton.

Java:

WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
wv.addJavascriptInterface(new Object()
{
   @JavascriptInterface           // For API 17+
   public void performClick(String strl)
   {
      stringVariable = strl;
      Toast.makeText (YourActivity.this, stringVariable, Toast.LENGTH_SHORT).show();
   }
}, "ok");

HTML:

<button type="button" value="someValue" onclick="ok.performClick(this.value);">OK</button>
17
répondu user2999943 2014-03-09 18:46:25
    WebView browser = new WebView(this);
    browser.getSettings().setJavaScriptEnabled(true);
    browser.loadUrl("file:///android_asset/page.html");
    setContentView(browser);
    WebSettings ws = browser.getSettings();
    ws.setJavaScriptEnabled(true);
    browser.addJavascriptInterface(new Object()
    {
        @JavascriptInterface           // For API 17+
        public void performClick(String strl)
        {

            Toast.makeText (MainActivity.this, strl, Toast.LENGTH_SHORT).show();

        }
    }, "ok");

Page.fichier html

<html>
<body>

    First name: <input type="text" name="fname" id="txtfname"><br>
    Last name: <input type="text" name="lname" id="txtlname"><br>

    <script>
    function getValues() {
    document.getElementById("btnOK").value = document.getElementById("txtfname").value+" "+document.getElementById("txtlname").value;
    }
    </script>

    <button type="button" value="" id="btnOK" onclick="getValues();ok.performClick(this.value);">OK</button>
</body>
</html>
0
répondu Raviraj Desai 2017-03-09 09:24:02