6

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

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

任何人都知道这是如何完成的,或者是否有其他方法没有 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()
4

2 回答 2

1

这很容易上手,但并不明显或没有很好的记录。

首先,您想获得Androidwebview 内对象的挂钩。然后您可以使用它来注册一个或多个回调。举个简单的例子,我们只做一个弹出警告的例子,其中包含来自 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 端传递的字符串。

于 2012-10-29T11:22:48.337 回答
0

不幸的是,我个人从来没有能够同时使用registerCallback()eventWaitFor(). 但是,如果您仍然热衷于使其正常工作,我强烈建议您继续下载sl4a_r5x - 一个非官方但更新和更新的 SL4A 版本。它支持使用FullScreenUi的基于原生 Android 应用程序使用的相同 xml 代码。有了这个,你可以做你所追求的,并且可以在页面上找到示例。
希望这对您有所帮助,并且您仍然对 SL4A 感兴趣!

于 2011-12-23T17:28:55.733 回答