2011年6月23日木曜日

Android WebView loadDataメモ

WebViewはwebページ表示するために使うものと思ってたけど、htmlの文字列を渡して表示もできるってことに気づいた。htmlの方が慣れてるし、けっこう便利!ちょっとハマった点メモ。

使い方は簡単で、htmlのデータ用意して、loadDataするだけ。
        WebView webview = new WebView(this);
        String data = "<html><head><meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\"></head>";
        data +=  "<body>ハロー</body></html>";
        webview.loadData(data, "text/html", "UTF-8");
        setContentView(webview);
ヘッダにmetaタグで指定してやらないと文字化けるので注意が必要。metaがないと下記のように化ける。

だいたいこんな感じで使ってたけど、たまに表示ができないときがあるので調べ見てる。どうもdataに%が入ると表示ができないよう。
     data +=  "<body>ハロー%</body></html>";

%が入るかもしれないデータの場合は、URLEncoder.encodeしてやれば表示できる。
        try {
            data +=  "<body>" + URLEncoder.encode("ハロー%", "UTF-8") + "</body></html>";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

※追記:URLEncoder.encodeだと半角スペースが+で表示されてしまうな。%を%25にreplaceするだけでもいいのかな。

とりあえずloadDataはメタタグ入れるのとencodeに気をつけてれば文字化けの問題はなさそう。

ちなみに、loadDataの説明にはちゃんと下記記述があったのでちゃんと読まずに使ってただけ。。。
%以外にも#とかも書かれてるけど、置き換えなくても表示できた。%だけ上のように「Web page not available」。
A String of data in the given encoding. The date must be URI-escaped -- '#', '%', '\', '?' should be replaced by %23, %25, %27, %3f respectively.



注意するのはそんな程度。htmlだからtableタグが使えるのがちょっとうれしい。tableタグなくてもTableLayoutあるし問題ないんだけど、罫線ひくのにbackgroundとmargin使って線のように見せる(参照:Display border lines in TableLayout on Android Development)のがなんだかなとは思ってた。もちろんtableタグならborder指定するだけで簡単に表に枠線を付けられる。
すごく簡単。rowの数が任意のときにも便利。任意の場合、TableLayoutだとどうやるのかな。TableRowをinflateして、TableLayoutにaddViewしてを繰り替えしていくとかかな?