2010-10-31 17 views
34

No estoy muy familiarizado con javascript, pero creo que esta es la mejor manera de lograr mi objetivo. Si no es así, por favor, corríjanme.Detectar hacer clic en el botón HTML mediante javascript en Android WebView

Tengo un texto de licencia de 2 botones al final. Todo esto está escrito en HTML en un WebView porque hay algunos enlaces en la licencia. Ahora, quiero que cuando el usuario haga clic en el botón "Aceptar" en el WebView, esto desencadene algunos javascript o detectores que pueda capturar en Java para activar un Intent para avanzar en la aplicación. (El botón de cancelar haría lo contrario, pero si sé cómo hacer uno, puedo hacer el otro;;))

¿Suena esto para alguien? Cualquier explicación o código de muestra es bienvenido.

Respuesta

56

Finalmente lo conseguí por mi cuenta después de leerlo un poco. Algo difícil cuando no sabes nada sobre javascript y cuando el documento es bastante delgado sobre el tema.
Aquí está mi solución, espero que esto ayude a otros:

Con una página HTML que contiene 2 botones al final de esa manera:

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

envío el caso de que el clic con el Javascript en la parte superior de mi página 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 y refuse son objetos Java 2 que pasa a través de la interfaz JavaScript para utilizar sus métodos. Así que en java, creé 2 botones (en realidad no se muestran en la actividad, aquí sólo por sus métodos y son una especie de sombra de los botones HTML:

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

Luego añade javascript para mi WebView:

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

Y, por último, manejar los eventos de clic en el método onClick:

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

Esperamos que ayude a algunas personas

+0

@neha la forma de resolver este problema me da ningún ejemplo sencillo .. – NagarjunaReddy

+2

@Sephy puede usted explicar lo que es válido y se niegan son botones u objetos JavaWebInterface? ¿Y el método onclick se debe a que ha implementado el oyente onclick o algo por el estilo? Lo siento pero no puedo ejecutar el código anterior. Por favor ayuda. Gracias – newBie

+0

@Sephy esto no funciona en Android 2.3. ¿Hay alguna forma de implementar esto? –

35

Aquí hay una solución más simple. En el lado de Java, crea un oyente para cada botón. No tiene por qué haber ninguna clase en particular, ya que el método será buscado utilizando la reflexión:

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

Luego, en el código HTML, llamar directamente desde la etiqueta de botón:

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

Me parece que es bastante parecido al mío con solo un botón. Tenga en cuenta que vincularé la interfaz de JavaScript a un botón en lugar de a un simple objeto, de esta manera puede beneficiar a todo el conjunto de métodos y cosas relacionadas con los botones. – Sephy

+0

El método de peastman es en realidad mejor, al menos semánticamente. Enlazar con un 'Botón' engañará a las personas para que crean que hay un vínculo entre ellas, pero no las hay. Al código no le importa si enlaza su JavaScript con un 'Botón' o un' Bitmap' o un 'Objeto' simple. Llamará a cualquier función que le diga. No tienes acceso a métodos adicionales. Por ejemplo, al llamar 'setText()' en su objeto 'Button' de Java no cambiará el texto de sus botones HTML. –

+0

¡¡Es una pieza increíble de trabajo !!! – Karthik

15

En caso también desea recuperar el valor del botón.

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> 
página
+0

¿Este nombre "performClick" tiene que ser el mismo tanto en java como en javascript? ? – user1530779

+0

¿Este nombre "performClick" tiene que ser el mismo tanto en java como en javascript? – user1530779

+1

@ user1530779 Sí, porque es el nombre de la función Objeto – 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"); 

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

Cuestiones relacionadas