2011-08-22 10 views
6

ho voluto conoscere la risposta a una domanda semplice, ma ho trovato un buon have'nt una (ho google per ore :))inviare gli eventi in pitone a JavaScript utilizzando SL4A

sto giocando con la sl4a con python e posso inviare eventi da js allo script python, ma js non cattura l'eventPost che ho inserito nel codice qui sotto da python a js.

Qualcuno sa come è stato fatto o se c'è un altro modo senza registerCallback?

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

codice Python:

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

La funzione JS 'alert_me' non fa uso dell'argomento ricevuto. Se lo facesse, l'arg avrebbe un membro chiamato 'data', quindi' data.data' nella tua funzione, che valuterà come '" Done Message "'. –

risposta

1

Questo è semplice per funzionare, ma non è ovvio o ben documentato.

Prima si desidera ottenere un hook per l'oggetto Android all'interno della visualizzazione Web. Quindi puoi usarlo per registrare uno o più callback. Per un semplice esempio, ne faremo uno che apre un avviso con un messaggio da Python.

var droid = new Android(); 

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

In questo caso, echo è il nome del tipo di evento che si desidera questo callback per gestire. Quindi gestirà 'echo events'. I nomi degli eventi sono stringhe arbitrarie, chiamali solo se hanno un senso.

Nello script Python che ha avviato la visualizzazione Web, è ora possibile inviare eventi al gestore registrato in qualsiasi momento.

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

Il secondo argomento qui è il messaggio che si desidera passare al callback JavaScript.

Si noti che sebbene si restituisca il messaggio come stringa, esso giunge nella funzione JavaScript come oggetto. Quell'oggetto, lo chiamiamo msg sopra, ha un attributo chiamato data che contiene la stringa passata dal lato Python.

0

Purtroppo non sono mai stato personalmente in grado di ottenere questo lavoro, utilizzando sia registerCallback() e eventWaitFor(). Tuttavia, se sei ancora interessato a farlo funzionare, ti consiglio vivamente di scaricare e scaricare sl4a_r5x - una versione non ufficiale ma aggiornata e aggiornata di SL4A. In esso è supportato l'utilizzo di FullScreenUi basato sullo stesso codice xml utilizzato dalle app Android native. Con questo puoi fare quello che stai cercando e gli esempi possono essere trovati sulla pagina.
Speriamo che questo sia stato utile e sei ancora interessato a SL4A!

+0

in realtà lo script di cui sopra funziona bene :) sto usando quella versione di sl4a, ma sto ancora aspettando fino a quando l'intero schermo diventa più efficiente l'analisi di alcune proprietà xml che non ha funzionato ormai. Oggi il modo più efficiente per programmare Android è ancora java o C# con il mono..cause il gui con python senza un webstyle è un incubo. Grazie per la risposta – dyoser

+0

È banale utilizzare qualcosa come l'interfaccia utente di jQuery Mobile per creare un'interfaccia, se non ne hai bisogno per sembrare nativa. –

Problemi correlati