2010年7月10日土曜日

Android WebView を使う

公式リファレンスはこちら
"WebView | Android Developers"

AndroidManifest.xml にパーミッションの設定を忘れずに!

<uses-permission android:name="android.permission.INTERNET" />


onCreate でインスタンスを作る

WebView webview = new WebView(this);
setContentView(webview);


layout xml で定義する

setContentView(R.layout.main);
webview = (WebView) findViewById(R.id.webview);


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>



ページを読み込む

webview.loadUrl("http://www.google.com");



WebViewClient を設定する
デフォルトでは、loadUrl で読み込んだページ内のリンクをクリックすると、標準のブラウザが起動して先のページはそっちで表示される。
自分の WebView で遷移先も表示させるには WebViewClient を設定すればいい。


webview.setWebViewClient(new WebViewClient() {});


WebViewClient はコンテンツのレンダリングに影響がでるときに呼ばれる。
例えば、フォーム入力でのエラーなど。
shouldOverrideUrlLoading() を介すことで、URL の読み込みに割り込む(intercept)ことができる。

WebChromeClient を設定する
WebChromeClient サブクラスはブラウザのUIに影響を与える可能性のある処理が起こったときに呼ばれる。例えば、アップデートの進捗や JavaScript の alerts はここに送られる。 (see Debugging Tasks).


webview.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
activity.setProgress(progress * 1000);
}
});


デフォルトのズームコントロールを使う
WebSettings.setBuiltInZoomControls(boolean)


webview.getSettings().setBuiltInZoomControls(true);


JavaScript を有効にする
setJavaScriptEnabled()


webview.getSettings().setJavaScriptEnabled(true);


JavaScript-to-Java interfaces を追加する
addJavascriptInterface(Object, String)

Java objects を WebView にバインドすることで、webpage の JavaScript から Java側を制御できる

  adamrocker さんのページがわかりやすいです。
  ・"throw Life - addjavascriptinterface"



■Cookie and window management

・cache や cookie はブラウザアプリのデータとは共有しないため、Cookies は別のスレッドで管理される。よって、index building のような操作は UI スレッドをブロックしない。もし、アプリ内で cookies を使いたい場合は CookieSyncManager の手順にしたがう。

・デフォルトでは、HTMLで指定されている新しいウィンドウを開く操作は無視される。つまり、JavaScript から開く場合も、リンクの target 属性から開く場合も無視される。WebChromClient をカスタマイズすることで、複数ウィンドウを開く場合など、独自の振る舞い(+描画)をさせることができる。

・標準の動作では、デバイスの向きや他の fonciguration changes で Activity が destory されたり recreate されたりするが、このときに WebView は現在のページを reload する。もし、この動作をしなくないなら、AndroidManifest.xml で android:configChanges に orientation や keyboardHidden を設定すればいい。詳しくは Handling Runtime Changes


■Building web pages to support different screen densities

デフォルトでは、medium density screen 上でのデフォルト表示に一致するようにスケールされて描画される。つまり、high density screen では 1.5x に、low density screen では 0.75x にスケールされて表示される。
API Level 5 (Android 2.0) から different screen densities へのスクリーンターゲットを助けるために、 WebView は DOM, CSS, and meta tag 特性をサポートしている。


参考ページ
・"北から南や西を見て思うこと: WebViewを使ったスクレイピングの使い道" ( http://fromnorth.blogspot.com/2010/02/webview.html )
・"八角研究所 : Android WebViewでGoogle APIを扱う" ( http://www.blogger.com/img/blank.gifhttp://www.hakkaku.net/hakkaker_blog/20090804-557 )