2010年7月10日土曜日

Android WebView を使う

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

AndroidManifest.xml にパーミッションの設定を忘れずに!
  1. <uses-permission android:name="android.permission.INTERNET" />  


onCreate でインスタンスを作る
  1. WebView webview = new WebView(this);  
  2. setContentView(webview);  


layout xml で定義する
  1. setContentView(R.layout.main);  
  2. webview = (WebView) findViewById(R.id.webview);  


main.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <WebView  
  8.      android:id="@+id/webview"  
  9.      android:layout_width="fill_parent"   
  10.      android:layout_height="wrap_content"   
  11.      android:layout_weight="1"  
  12.  />  
  13. </LinearLayout>  



ページを読み込む
  1. webview.loadUrl("http://www.google.com");  



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

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


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

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

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


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

  1. webview.getSettings().setBuiltInZoomControls(true);  


JavaScript を有効にする
setJavaScriptEnabled()

  1. 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 )