Android(開発)/WebViewの使い方

Android(開発)/WebViewの使い方

バージョンと製造年月日

  • 2011-12-15
  • Android API Level 7

下準備

AndroidManifest.xmlに以下の許可を追加してネットワークを使えるようにしておく

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

XMLで画面レイアウトを記述

WebViewを貼りつけたい画面のレイアウトファイルにWebViewのタグを挿入する。↓こんな風に

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <WebView
        android:id="@+id/webView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:visibility="visible"
        android:scrollbarStyle="insideOverlay"
    />
</FrameLayout>

Javaコードからレイアウトで記述したWebViewを掴む

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

setContentViewでお目当てのレイアウトで作っちゃって、出来上がったレイアウト中のWebViewをfindViewByIdでID指定で掴む

URLへ飛ぶ

WebView wv1 = (WebView) findViewById(R.id.webView1);
wv1.setWebViewClient(new WebViewClient());
wv1.loadUrl("http://hogehoge.jp");

URLへジャンプする場合は通常このようにWebViewClientと組み合わせて使う。WebViewClientと組み合わせることでウィンドウ的な制御をシステムからWebViewへもってくることができる。

組み合わせないと読み込まれたurlがリダイレクトする場合や、ただ単にリンクを押した場合にブラウザが別activityで開いてしまう。

アプリ内蔵の静的なHTMLファイルを表示する

loadUrlは静的なHTMLファイルも読み込むことができる。 まず静的なファイルをassetsディレクトリに設置する。 そして

wv1.loadUrl("file:///android_asset/hoge.html");

という風なパラメータで読み込むことが出来る。

Stringの内容をWebViewへ表示する

単に簡単なメッセージだけだしたい場合や複雑なHTMLをJava側で組立たい場合にStringの内容をそのまま流し込みたくなる。 そのような場合はloadDataメソッドを使う・・・・が

なんだかこのメソッドにはバグがあるらしく、中のJavaScriptは動かないし、%と#を含む文字列が入るとダメらしい。 なので使わない。

代替としてもっとパラメータをたくさん取るメソッドでloadDataWithBaseURLというのがあるのでこのように

wv1.loadDataWithBaseURL("hoge", "<html><head></head><body><h1>hoge</h1></body></html>","text/html","utf-8", "");

あまったパラメータを適当に埋めて使う

JavaScriptを駆動する

WebViewはデフォルトでJavaScriptの実行がオフになっているので明示的にONにする必要がある

wv1.getSettings().setJavaScriptEnabled(true);

表示の際に右端の数ピクセルの余白を除去する

表示の際になぜかWebViewでは右端に何もなくても、幅をぴったり指定にしていても数ピクセルの余白ができてしまう。

これはスクロールバー領域が勝手にコンテンツとは別にくっついていてその余白ということらしい。 このことで表示領域が広がってしまい、無用な横スクロールが発生したりする。

このスクロールバー領域をコンテンツ側に押しこむことができる。setVerticalScrollbarOverlayオプションをONにすればいい

webView.setVerticalScrollbarOverlay(true);

これでスクロールバー領域がコンテンツ側に押し込まれて幅がぴったりになる

状態取得

同一アプリ内の違うWebView間のcookieの扱い

同じアプリ内でもWebViewのコンポーネントを複数扱うと思うが、このWebView間のcookieの扱いはどうなっているのか?

Android2.3.4で挙動を見たところ、特に何か特別なコードを書かなくても自動的に共通化されるようだ。 つまりWebView Aで受け取ったcookieはWebView Bで送出することになるということ。

とういうことでcookieがOKなので当然通常のsession管理も共通化できるな。

超短期の有効期間をセットしたcookieの期限が正しく設定されない

再現環境:Android2.2シミュレータ

cookieの有効期間をすごく短く(10秒とか)した場合その値が正しく設定されないような挙動をする。 具体的には有効期間は直ぐに切れて、cookieが消滅し設定されている値を送出しないはずなのだが、何時まで経っても送出する。

逆にこののような事象もあるらしい→Android開発ノート: 機種によっては、有効期限を短く設定するとCookieを保存してくれない

参考サイト

イベント

タグ

android_dev/howto_use_webview.txt · 最終更新: 2012-04-05 10:28 by ore