3

では、外部の JavaScript ファイルと CSS ファイルを SL4A アプリに追加できるようにするために、3 つの方法を試してみました。私は3UKのZTE Racerで2.3 Gingerbread(Googleアプリを使用したcyanogenmod)を使用しており、Android python 2.6.2(適切な場合)でSL4A r4を使用しています。

まず、相対リンクが機能すると仮定しました。

<!-- 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)

の body タグの末尾にあるインライン スクリプト内の次のコード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 のパスを初期化する方法についての仮定に頼ることはできません。sys.path[0]、どうにかして結果をwebviewに伝えることができれば!

私はこれらの失敗のそれぞれを単独でバグと考えていますが、3 つすべてを合わせるとただ憂鬱です! Titanium に戻るよりも、このフレームワークを使用したいと思います。状況が厳しくなり、JavaScript UI をフリーズさせたくない場合に、Python にドロップダウンする力が得られるからです。ただし、構造化できない場合は、私のコードをさまざまなファイルに出力すると、すべてのコードファイルでインラインjqueryを使用してSL4Aの電話での編集機能を利用するのに苦労することになります...

実際に機能するこれを行う方法はありますか?SL4A を使用して HTML5 / JavaScript アプリを Android で実行している人はいますか?

4

1 に答える 1

2

この質問に対する答えは単純に RTFM です -

droid.eventWait()

単一のオプションの整数パラメーター (イベントを待機する秒数) を取ります。

droid.eventWaitFor()

一方、(必須の) 最初の引数の文字列を使用して、イベントのタイプでフィルター処理できます。

すべての詳細はこちら.

私の悪い。

于 2011-11-15T11:50:11.287 に答える