使用 sl4a 将事件从 python 发送到 javascript
Posted
技术标签:
【中文标题】使用 sl4a 将事件从 python 发送到 javascript【英文标题】:send events from python to javascript using sl4a 【发布时间】:2011-11-01 13:13:40 【问题描述】:我想知道一个简单问题的答案,但我没有找到一个好的答案 (我已经用谷歌搜索了几个小时:))
我正在用 python 玩 sl4a,我可以将事件从 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>
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()
【问题讨论】:
你的 JSalert_me
函数没有使用它收到的参数。如果是这样,则 arg 将有一个名为 data
的成员,因此在您的函数中 data.data
将评估为 "Done Message"
。
【参考方案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 端传递的字符串。
【讨论】:
【参考方案2】:不幸的是,我个人从来没有能够使用registerCallback()
和eventWaitFor()
来完成这项工作。但是,如果您仍然热衷于使其正常工作,我强烈建议您继续下载sl4a_r5x - 一个非官方但更新和更新的 SL4A 版本。它支持使用基于原生 Android 应用程序使用的相同 xml 代码的 FullScreenUi。有了它,您可以做您想做的事,并且可以在页面上找到示例。希望这对您有所帮助,并且您仍然对 SL4A 感兴趣!
【讨论】:
实际上上面的脚本工作正常 :) 我正在使用该版本的 sl4a 但我仍在等到 fullscreenUI 变得更有效地解析一些现在不起作用的 xml 属性。今天,更有效的 android 编程方法仍然是 java 或 c# 与 mono..因为没有 webstyle 的 python 的 gui 是一场噩梦。谢谢你的回答 如果您不需要看起来像原生的,那么使用 jQuery Mobile UI 之类的东西来构建界面是微不足道的。以上是关于使用 sl4a 将事件从 python 发送到 javascript的主要内容,如果未能解决你的问题,请参考以下文章
从 Android 开始:Java 或 Python (SL4A)
Android:从 Java 代码调用 Python 脚本(通过 SL4A)
Python xmpppy客户端未向appengine xmpp客户端发送消息