Android の WebView について調べまくっていますが、Android1.6を考慮にいれると、やれることが少なくて困ることが多いです。基本的な調査は2010/10/27/AndroidのWebViewを極める方法で書いています。
今回調べたのは、JavaScriptからJavaのメソッドを呼んだときの挙動について調査。
基本的に、JavaScriptからJavaを呼ぶには以下のように、addJavascriptInterface() を利用します。
// HogeActivity.java に以下のコードを追加 webview.addJavascriptInterface(javaObject, "_w");
そして、javaObject に以下のメソッドを定義
public void test(Object obj) { if (obj == null) { log("[test] null"); } else { log("[test]"+obj.toString()); } }
JavaScript から呼んでみると・・・
_w.test(function(hoge){alert(hoge);}); _w.test([1,2,3]); _w.test({a:1,b:2,c:3}); _w.test("test"); _w.test(3);
結果は、全部 null が表示されます。やはり、Java側のメソッドでは型を明示しないとダメみたいです。
public void testInt(int v) { log("[testInt]"+v); } public void testStr(String v) { log("[testStr]"+v); }
数値と文字列は勝手に変換してくれました。配列は適当な文字列に変換してくれるみたいです。そして無名関数を渡したらその定義文字列が得られました。これは何かに使えるかな?ちょっと面白いかも。
_w.testInt("test"); // 0 _w.testInt(3); // 3 _w.testInt([1,2,3]);// 0 _w.testStr("test"); // test _w.testStr(3); // 3 _w.testStr([1,2,3]);// 1,2,3 _w.testStr(function(hoge){ return hoge; }); // function(hoge){ return hoge; } _w.testStr({a:1,b:2,c:3}); // [object Object]
今後のTODO
それで、ここまでやってみて・・・オープンソースなんだから、WebViewのソース見るのが一番早いんじゃないかと思ってみたのですが・・・少し入り組んでいるようなので後で調べる。
たぶん、以下のあたり
https://github.com/OESF/OHA-Android-2.2_r1.1/tree/master/f..