使用sl4a将事件从python发送到javascript

时间:2011-08-22 23:10:46

标签: android python sl4a

我想知道一个简单问题的答案,但我找不到一个好问题 (我已经谷歌了几个小时:))

我正在玩带有python的sl4a,我可以将事件从js发送到python脚本,但是js没有捕获我在下面的代码中从python到js的eventPost。

任何人都知道这是怎么做的,或者如果没有registerCallback还有另一种方法吗?

HTML CODE:

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

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 个答案:

答案 0 :(得分:1)

这很容易上班,但不明显或记录良好。

首先,您希望获取Webview中Android对象的挂钩。然后,您可以使用它来注册一个或多个回调。举一个简单的例子,我们只会做一个用Python发来的消息弹出一个警告。

    var droid = new Android();

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

在这种情况下,echo是您希望此回调处理的事件类型的名称。所以这将处理'回声事件'。事件名称是任意字符串,只要有意义就调用它们。

在启动webview的Python脚本中,您现在可以随时将事件发布到已注册的处理程序。

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

此处的第二个参数是您要传递给JavaScript回调的消息。

请注意,虽然您将消息作为字符串传回,但它作为对象到达JavaScript函数。该对象,我们在上面调用它msg,有一个名为data的属性,它包含您从Python端传递的字符串。

答案 1 :(得分:0)

不幸的是,我个人从来没有能够使用registerCallback()eventWaitFor()来完成这项工作。但是,如果您仍然热衷于实现此功能,我强烈建议您继续前进并下载sl4a_r5x - 一个非正式但更新且更新的SL4A版本。它支持使用FullScreenUi基于原生Android应用程序使用的相同xml代码。有了这个你可以做你想要的,并在页面上找到例子。
希望这有用,你仍然对SL4A感兴趣!