отправлять события из python в javascript, используя sl4a - PullRequest
6 голосов
/ 23 августа 2011

Я хотел бы знать ответ на простой вопрос, но я не нашел хорошего (я гуглю его часами :))

Я играю с sl4a с python, и яможет отправлять события из js в скрипт python, но js не перехватывает eventPost, который я вставил в код ниже от python до js.

Кто-нибудь знает, как это было сделано или есть другой способ безregisterCallback?

КОД 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>

КОД ПИТОНА:

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

Ответы [ 2 ]

1 голос
/ 29 октября 2012

Работать легко, но не очевидно и не задокументировано.

Сначала вы хотите подключить объект Android внутри веб-просмотра. Затем вы можете использовать его для регистрации одного или нескольких обратных вызовов. Для простого примера мы просто сделаем тот, который выдает предупреждение с сообщением из Python.

    var droid = new Android();

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

В этом случае echo - это имя типа события, которое вы хотите обработать с помощью этого обратного вызова. Так что это будет обрабатывать «эхо-события». Имена событий являются произвольными строками, просто назовите их как угодно.

В скрипте Python, который запустил веб-просмотр, теперь вы можете публиковать события в зарегистрированном обработчике в любое время.

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

Вторым аргументом здесь является сообщение, которое вы хотите передать обратному вызову JavaScript.

Обратите внимание, что, хотя вы передаете сообщение обратно в виде строки, оно поступает в функцию JavaScript как объект. Этот объект, который мы называем msg выше, имеет атрибут data, который содержит строку, которую вы передали со стороны Python.

0 голосов
/ 23 декабря 2011

К сожалению, мне никогда не удавалось заставить это работать, используя registerCallback() и eventWaitFor().Однако, если вы по-прежнему заинтересованы в этом, я настоятельно рекомендую вам зайти и загрузить sl4a_r5x - неофициальный, но более новый и обновленный выпуск SL4A.Это поддержка использования FullScreenUi на основе того же XML-кода, который используют нативные приложения Android.С этим вы можете делать то, что вам нужно, и примеры можно найти на странице.
Надеюсь, это было полезно, и вы все еще заинтересованы в SL4A!

...