menu
書いてる野郎
orebike@gmail.com
AndroidManifest.xml
に以下の許可を追加してネットワークを使えるようにしておく
<uses-permission android:name="android.permission.INTERNET"/>
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>
setContentView(R.layout.main); WebView hoge = (WebView) findViewById(R.id.webView1);
setContentViewでお目当てのレイアウトで作っちゃって、出来上がったレイアウト中のWebViewをfindViewById
でID指定で掴む
WebView wv1 = (WebView) findViewById(R.id.webView1); wv1.setWebViewClient(new WebViewClient()); wv1.loadUrl("http://hogehoge.jp");
URLへジャンプする場合は通常このようにWebViewClient
と組み合わせて使う。WebViewClientと組み合わせることでウィンドウ的な制御をシステムからWebViewへもってくることができる。
組み合わせないと読み込まれたurlがリダイレクトする場合や、ただ単にリンクを押した場合にブラウザが別activityで開いてしまう。
loadUrl
は静的なHTMLファイルも読み込むことができる。
まず静的なファイルをassetsディレクトリに設置する。
そして
wv1.loadUrl("file:///android_asset/hoge.html");
という風なパラメータで読み込むことが出来る。
単に簡単なメッセージだけだしたい場合や複雑なHTMLをJava側で組立たい場合にStringの内容をそのまま流し込みたくなる。
そのような場合はloadData
メソッドを使う・・・・が
なんだかこのメソッドにはバグがあるらしく、中のJavaScriptは動かないし、%と#を含む文字列が入るとダメらしい。 なので使わない。
代替としてもっとパラメータをたくさん取るメソッドでloadDataWithBaseURL
というのがあるのでこのように
wv1.loadDataWithBaseURL("hoge", "<html><head></head><body><h1>hoge</h1></body></html>","text/html","utf-8", "");
あまったパラメータを適当に埋めて使う
WebViewはデフォルトでJavaScriptの実行がオフになっているので明示的にONにする必要がある
wv1.getSettings().setJavaScriptEnabled(true);
表示の際になぜかWebViewでは右端に何もなくても、幅をぴったり指定にしていても数ピクセルの余白ができてしまう。
これはスクロールバー領域が勝手にコンテンツとは別にくっついていてその余白ということらしい。 このことで表示領域が広がってしまい、無用な横スクロールが発生したりする。
このスクロールバー領域をコンテンツ側に押しこむことができる。setVerticalScrollbarOverlay
オプションをONにすればいい
webView.setVerticalScrollbarOverlay(true);
これでスクロールバー領域がコンテンツ側に押し込まれて幅がぴったりになる
同じアプリ内でもWebViewのコンポーネントを複数扱うと思うが、このWebView間のcookieの扱いはどうなっているのか?
Android2.3.4で挙動を見たところ、特に何か特別なコードを書かなくても自動的に共通化されるようだ。 つまりWebView Aで受け取ったcookieはWebView Bで送出することになるということ。
とういうことでcookieがOKなので当然通常のsession管理も共通化できるな。
再現環境:Android2.2シミュレータ
cookieの有効期間をすごく短く(10秒とか)した場合その値が正しく設定されないような挙動をする。 具体的には有効期間は直ぐに切れて、cookieが消滅し設定されている値を送出しないはずなのだが、何時まで経っても送出する。
逆にこののような事象もあるらしい→Android開発ノート: 機種によっては、有効期限を短く設定するとCookieを保存してくれない