好的,所以我尝试了三种方法来将外部 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 应用程序?