Webブラウザ(WebView)を利用する(1)の記事では、WebViewの基本を書きました。
WebViewを利用したアプリを作る際に、読み込み中にユーザに対してダイアログを表示したり、読み込みに失敗した際など、特定のイベントに対して処理を行いことがあるかと思います。
そんな時はWebViewに対してWebViewClientを登録することで実現可能です。
WebViewClientクラス
WebViewClientクラスを継承したクラスを作成し、任意のイベントに対するメソッドをオーバーライドして、処理を記述します。
主なイベントは下記の通りです。
- ページのスケール変更時(拡大 or 縮小)
- ページの読み込み開始時
- ページの読み込み完了時
- ページの読み込み失敗時
- 認証要求開始時
他にもいくつかイベントがありますので公式のドキュメントを参照してください。
ここでは例として、ページの読み込み中にダイアログの表示、読み込み時にToastを表示するWebViewClientのサブクラスを作ってみます。
package org.jpn.techbooster.sample; import android.app.Dialog; import android.graphics.Bitmap; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; public class WebViewClientSample extends WebViewClient { private Dialog dialog; public WebViewClientSample() { super(); dialog = null; } private void disimissDialog() { dialog.dismiss(); dialog = null; } //ページの読み込み開始 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { dialog = new Dialog(view.getContext()); dialog.setTitle("Now Loading"); dialog.show(); } //ページの読み込み完了 @Override public void onPageFinished(WebView view, String url) { disimissDialog(); } //ページの読み込み失敗 @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { if (null != dialog) { disimissDialog(); } Toast.makeText(view.getContext(), "エラー", Toast.LENGTH_LONG).show(); } }
setWebViewClientメソッド
WebViewクラスのsetWebViewClientメソッドでWebViewClientクラスのインスタンスを登録します。
先ほどのWebViewClientクラスのサブクラスを使ってみます。
public class WebViewSampleActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WebView webview = (WebView)findViewById(R.id.web); webview.setWebViewClient(new WebViewClientSample()); webview.loadUrl("http://www.google.co.jp/"); } }
getTitleメソッド
WebViewクラスのgetTitleメソッドは表示中のURLのタイトルを取得することができます。
ページ読み込み時にタイトルを取得して、Toastで表示するように修正してみましょう。
//ページの読み込み完了 @Override public void onPageFinished(WebView view, String url) { disimissDialog(); Toast.makeText(view.getContext(), view.getTitle(), Toast.LENGTH_LONG).show(); }