我想知道一个简单问题的答案,但我找不到一个好问题 (我已经谷歌了几个小时:))
我正在玩带有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()
答案 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感兴趣!