3

好的,所以我尝试了三种方法来将外部 javascript 和 CSS 文件添加到我的 SL4A 应用程序中。我在 3UK 的 ZTE Racer 上使用 2.3 Gingerbread(带有谷歌应用程序的 cyanogenmod),并使用 SL4A r4 和 android python 2.6.2(在适当的情况下)。

首先,我假设相对链接会起作用:

<!-- GUI.html - loaded directly within SL4A UI. -->
<script type="text/javascript" src="jquery.js"></script>

情况并非如此 - 未加载相关脚本和样式。

接下来,我尝试使用事件从 python 加载脚本中传递绝对路径:

# script.py - launched in order to load window.
import android, sys, time
droid = android.Android()

path = "file://" + sys.path[0]
droid.webViewShow(path + "/GUI.html")
droid.eventPost('globalAppPath', path + "/")

# sleep for a bit to allow webview to load the DOM and read the event.
time.sleep(10)

以及正文标记末尾的内联脚本中的以下代码GUI.html

  // (inlined jquery to be able to append to a debug div easily.)
  var droid = new Android();
  var event = droid.eventWait('globalAppPath');
  $('#loading').append("<br/>" + JSON.stringify(event));

但是,这会失败,因为事件没有“结果”属性,只有“错误”属性(一些 Java 异常:

org.json.JSONException: Value globalAppPath at 0 of type java.lang.String cannot be converted to int

来自 python 的路径字符串不能转换为未装箱的int?!)。

最后,我尝试document.URL按照这个问题使用,如下所示:

  // (inlined jquery to be able to append to a debug div easily.)
  $('#loading').append("<br/>" + document.URL);

但是,这只是返回路径:

file:///mnt/sdcard/sl4a/scripts/

实际上正确的路径应该是

file:///mnt/sdcard/sl4a/scripts/run-app/GUI.html

可能是这个不正确的路径首先导致了失败 - 如果相关脚本正在查找可以解释事情的父目录。但是,当以 APK 形式分发给不同制造商的 android 实现时,这显然是不可靠的——我不能依赖关于 SL4A 初始化 Web 视图 URL 路径的方式的任何假设——我更喜欢使用更动态和正确的 python sys.path[0],如果我能以某种方式将结果传达给 webview 就好了!

我会认为这些失败中的每一个都是一个错误,但是这三个一起只是令人沮丧!我更愿意使用这个框架而不是回到 Titanium,因为它让我有能力在遇到困难并且你不希望你的 javascript UI 冻结时掉入 python,但是如果我不能构建我的代码输出到不同的文件中,我将很难利用 SL4A 的电话编辑功能以及每个代码文件中的内联 jquery...

有没有一种方法可以真正有效地做到这一点?有没有人使用 SL4A 在 Android 上启动并运行 HTML5/javascript 应用程序?

4

1 回答 1

2

这个问题的答案就是 RTFM -

droid.eventWait()

采用单个可选整数参数 - 等待任何事件的秒数。

droid.eventWaitFor()

另一方面,允许您使用(强制)第一个参数中的字符串过滤事件类型。

所有细节都在这里

我的错。

于 2011-11-15T11:50:11.287 回答