2010-10-31 16 views
34

Non ho molta familiarità con javascript ma penso che questo sia il modo migliore per raggiungere il mio scopo. In caso contrario, correggimi.Rileva clic sul pulsante HTML tramite javascript in Android WebView

Alla fine ho un testo di licenza 2 pulsanti. Tutto questo è scritto in HTML in un WebView perché ci sono alcuni collegamenti nella licenza. Ora, voglio che quando l'utente fa clic sul pulsante "ok" nel WebView, questo attiva alcuni javascript o listener che posso afferrare in Java per far partire un Intent nell'applicazione. (Il pulsante Annulla farebbe il contrario, ma se so come fare uno, posso fare l'altro.;))

Questo suona un campanello per qualcuno? Qualsiasi spiegazione o codice di esempio è benvenuto.

risposta

56

Ho finalmente capito da solo dopo aver letto qualcosa. È un po 'difficile quando non sai nulla di javascript e quando il documento è piuttosto sottile sull'argomento.
Ecco la mia soluzione, spero che questo aiuterà gli altri:

Con una pagina HTML contenente 2 pulsanti al termine del genere:

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

mando caso di clic per il javascript in alto della mia pagina 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 e refuse sono 2 oggetti Java che ho passato attraverso l'interfaccia JavaScript per utilizzare i loro metodi. Quindi, in java, ho creato 2 pulsanti (in realtà non visualizzati nella attività, qui solo per i loro metodi e sono una sorta di ombre dei pulsanti HTML:

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

poi ho aggiunto javascript alla mia WebView:

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

E, infine, gestire gli eventi click nel metodo onClick:

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

Spero che questo vi aiuterà alcune persone

+0

@neha come risolvere questo problema mi ha dato alcun esempio semplice .. – NagarjunaReddy

+2

@Sephy Si può spiegare ciò che è valido e si rifiutano sono essi pulsanti o oggetti JavaWebInterface? E il metodo onclick è perché hai implementato il listener di onclick o qualcosa del genere? Mi dispiace ma non riesco a eseguire il codice sopra. Per favore aiuto. Grazie – newBie

+0

@Sephy questo non funziona in Android 2.3. Io ci sono un modo per implementarlo? –

35

Ecco una soluzione più semplice. Sul lato Java, crea un listener per ogni pulsante. Non ha bisogno di essere qualsiasi classe particolare, dato che il metodo sarà guardato utilizzando riflessione:

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

Poi nel codice HTML, chiamare direttamente dalla modifica del tasto:

<button type="button" onclick="ok.performClick();">OK</button> 
+1

Mi sembra abbastanza simile al mio anche se con un solo pulsante. Nota che legherei l'interfaccia javascript a un Button invece di un oggetto semplice, in questo modo puoi beneficiare dell'intero insieme di metodi e di elementi intorno ai pulsanti! – Sephy

+0

Il metodo di Peastman è in realtà migliore, almeno semanticamente. Legarsi a un "bottone" indurrà le persone a pensare che esista un collegamento tra loro, ma non c'è. Il codice non interessa se si associa il codice JavaScript a un 'Button' o a' Bitmap' o un semplice 'Object'. Chiamerà qualsiasi funzione tu gli dica. Non hai accesso a metodi extra. Ad esempio, chiamando 'setText()' sul tuo oggetto 'Button' Java non cambierà il testo dei tuoi pulsanti HTML. –

+0

Questo è uno splendido lavoro !!! – Karthik

15

Nel caso in cui vuoi anche recuperare il valore del pulsante.

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> 
+0

Il nome "performClick" deve essere uguale su java e javascript ? – user1530779

+0

Il nome "performClick" deve essere uguale su java e javascript? – user1530779

+1

@ user1530779 Sì, perché è il nome della funzione Oggetto – FrenchFalcon

0
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"); 

pagina.file 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>

Problemi correlati