2011-08-22 8 views
6

Chciałem znać odpowiedź na proste pytanie, ale ja have'nt znaleźć dobry (mam google godzinami :))wysyłania zdarzeń z pytona do javascript używając sl4a

gram przy pomocy sl4a z pythonem i mogę wysyłać zdarzenia z js do skryptu Pythona, ale js nie łapie eventPost i umieszczam poniższy kod z Pythona na js.

Ktoś wie, jak to się stało lub czy istnieje inny sposób bez rejestru.

kod 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 KOD:

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

Twoja funkcja JS 'alert_me' nie wykorzystuje argumentu, który otrzymuje. Jeśli tak, to arg będzie miał element o nazwie "data", więc 'data.data' w twojej funkcji, który oceni na' "Gotowy komunikat" '. –

Odpowiedz

1

Jest to bardzo proste w obsłudze, ale nie jest oczywiste lub dobrze udokumentowane.

Najpierw chcesz uzyskać hak do obiektu Android w widoku webowym. Następnie możesz go użyć do zarejestrowania jednego lub więcej wywołań zwrotnych. Dla prostego przykładu, po prostu zrobimy taki, który wyśle ​​alert z wiadomością z Pythona.

var droid = new Android(); 

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

W tym przypadku echo to nazwa typu zdarzenia chcesz to zwrotna w obsłudze. Tak więc zajmie się "zdarzeniami echa". Nazwy zdarzeń są dowolnymi ciągami, po prostu wywołaj je w sensie.

W skrypcie w języku Python, który uruchomił podgląd strony internetowej, możesz teraz publikować zdarzenia w zarejestrowanym module obsługi, kiedy tylko chcesz.

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

Drugi argument tutaj to wiadomość, którą chcesz przekazać do wywołania zwrotnego JavaScript.

Należy pamiętać, że pomimo przekazania komunikatu w postaci łańcucha, pojawia się on w funkcji JavaScript jako obiekt. Ten obiekt, nazywamy go powyżej, ma atrybut o nazwie data, który zawiera ciąg, który przekazałeś od strony Pythona.

0

Niestety nigdy nie osobiście udało się uzyskać tej pracy, z wykorzystaniem zarówno registerCallback() i eventWaitFor(). Jeśli jednak nadal zależy Ci na tym, żeby to zadziałało, zdecydowanie polecam przejrzeć i pobrać sl4a_r5x - nieoficjalną, ale nowszą i zaktualizowaną wersję SL4A. Jest w nim obsługa korzystania z FullScreenUi opartego na tym samym kodzie xml, którego używają natywne aplikacje na Androida. Dzięki temu możesz robić, co chcesz, a przykłady można znaleźć na stronie.
Mam nadzieję, że było to pomocne i nadal interesuje Cię SL4A!

+0

faktycznie powyższy skrypt działa dobrze :) Używam tej wersji sl4a, ale wciąż czekam, aż fullscreenUI stanie się bardziej wydajnym analizowaniem właściwości xml, które nie działały do ​​tej pory. Dziś bardziej wydajnym sposobem programowania Androida są nadal Java lub C# z mono .. bo gui z python bez webstyle to koszmar. Dziękuję za odpowiedź. – dyoser

+0

Używanie interfejsu jQuery Mobile do budowania interfejsu jest banalne, jeśli nie potrzebujesz natywnego wyglądu. –

Powiązane problemy