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

Ton*_*ony 6 python android sl4a

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

我正在玩带有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>
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

Car*_*ith 1

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

首先,您想要获得一个指向Androidwebview 内的对象的钩子。然后您可以使用它来注册一个或多个回调。举一个简单的例子,我们将只做一个弹出带有来自 Python 的消息的警报的示例。

    var droid = new Android();

    droid.registerCallback("echo", function(msg) {
        alert(msg.data)
    });
Run Code Online (Sandbox Code Playgroud)

在本例中,echo是您希望此回调处理的事件类型的名称。所以这将处理“回声事件”。事件名称是任意字符串,只要有意义就可以命名它们。

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

droid.eventPost("echo", "hello world")
Run Code Online (Sandbox Code Playgroud)

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

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