2011-08-22 18 views
6

que quería saber la respuesta a una pregunta sencilla, pero me encontré have'nt una buena (he google durante horas :))enviar eventos de pitón a javascript usando SL4A

estoy jugando con el sl4a con python y puedo enviar eventos de js al script de python, pero el js no está capturando el evento. Publique el código de abajo de python a js.

¿Alguien sabe cómo se hace esto o si hay otra forma sin el registerCallback?

código HTML:

<html> 
<head> 
<script> 
var droid = new Android(); 
function doit(){ 
    droid.makeToast("Text send :=>"+document.getElementById("msg").value); 
    droid.eventPost("doit",document.getElementById("msg").value); 
} 

function alert_me(data){ 
    droid.makeToast("All done!"); 
    document.getElementById("msg").value = ''; 
} 

droid.registerCallback("done",alert_me); 
</script> 
</head> 
<body> 
<input type="text" name="boton" id="msg" value="" /> 
<input type="button" name="boton" value="Go!" onclick="javascript:doit()" /> 
</body> 
</html> 

PYTHON CÓDIGO:

import android,time 

if __name__ == '__main__' : 

    droid = android.Android() 
    droid.webViewShow("file:///sdcard/sl4a/scripts/sample.html") 

    while True:   
     event = droid.eventWait().result 
     if event["name"] == 'doit': 
      droid.makeToast("Event catched! %s" % event['data']) 

      droid.eventPost("done","Done message") 
      time.sleep(2) 


    droid.exit() 
+0

Su función JS 'alert_me' no utiliza el argumento que recibe. Si lo hiciera, el arg tendría un miembro llamado 'data', entonces' data.data' en tu función, que evaluaría como '" Done Message "'. –

Respuesta

1

Esto es fácil de usar, pero no es obvio ni está bien documentado.

Primero desea obtener un gancho para el objeto Android dentro de la vista web. Luego puede usarlo para registrar una o más devoluciones de llamada. Para un ejemplo simple, haremos uno que muestre una alerta con un mensaje de Python.

var droid = new Android(); 

    droid.registerCallback("echo", function(msg) { 
     alert(msg.data) 
    }); 

En este caso, echo es el nombre del tipo de evento que desea esta devolución de llamada de manejar. Así que esto manejará los 'eventos de eco'. Los nombres de los eventos son cadenas arbitrarias, simplemente llámalos lo que tenga sentido.

En la secuencia de comandos de Python que inició la vista web, ahora puede publicar eventos en el controlador registrado siempre que lo desee.

droid.eventPost("echo", "hello world") 

El segundo argumento aquí es el mensaje que desea pasar a la devolución de llamada de JavaScript.

Tenga en cuenta que aunque devuelve el mensaje como una cadena, llega a la función de JavaScript como un objeto. Ese objeto, lo llamamos msg anterior, tiene un atributo llamado data que contiene la cadena que pasó desde el lado de Python.

0

Por desgracia nunca he estado personalmente capaz de conseguir este trabajo, utilizando tanto registerCallback() y eventWaitFor(). Sin embargo, si todavía está interesado en que esto funcione, le recomiendo encarecidamente que visite y descargue sl4a_r5x, un lanzamiento no oficial pero más reciente y actualizado de SL4A. En él se admite el uso de FullScreenUi basado en el mismo código xml que usan las aplicaciones nativas de Android. Con esto puede hacer lo que busca y encontrar ejemplos en la página.
¡Espero que esto haya sido útil y sigas interesado en SL4A!

+0

En realidad, el script anterior funciona bien :) Estoy usando esa versión del sl4a, pero todavía estoy esperando hasta que la UI de pantalla completa sea más eficiente al analizar algunas propiedades xml que no funcionaban por el momento. Hoy en día, la forma más eficiente de programar Android sigue siendo java o C# con el mono ... porque la interfaz gráfica de usuario con python sin un estilo web es una pesadilla. Gracias por su respuesta – dyoser

+0

Es trivial utilizar algo como la interfaz de usuario de jQuery Mobile para crear una interfaz, si no la necesita para que parezca nativa. –

Cuestiones relacionadas