2011-08-22 102 views
6

我想知道的答案,一个简单的问题,但我发现have'nt一个好 (我谷歌好几个小时了:))使用SL4A

我打发送事件从蟒蛇的javascript与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() 
+0

您的JS'alert_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端传递过来的字符串。

0

不幸的是我从来没有亲自去过能够得到这个工作,同时使用registerCallback()和​​3210。不过,如果你仍然渴望得到这个工作,我强烈建议你去下载并下载sl4a_r5x-一个非官方的,但更新的和更新版本的SL4A。它支持使用FullScreenUi的基于与原生Android应用程序使用的xml代码相同的代码。有了这个,你可以做你在做什么,例子可以在网页上找到。
希望这有帮助,你仍然对SL4A感兴趣!

+0

其实上面的脚本工作正常:)我使用该版本的sl4a,但我仍然在等待,直到fullscreenUI变得更高效解析一些xml属性,现在不起作用。今天,更有效的方式来编程android仍然是java或c#单声道......因为没有webstyle的python gui是一个噩梦。感谢您的回答 – dyoser

+0

使用诸如jQuery Mobile UI之类的东西来构建一个接口是很简单的,如果你不需要它看起来是本地的。 –