2011年12月28日

【Android】WebViewで読み込み中にダイアログを表示する(2)

以前、WebViewで読み込み中にダイアログを表示するという記事を紹介しました。
が、実際にそのままリリースしたところ、BadTokenExceptionが3件、エラー報告として上がって来ましたので、
改訂版を紹介いたします。


package名は各自変更をお願いします。

MyWebView.java

package com.shonanshachu.webclient;

import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MyWebViewClient extends WebViewClient{
    private ProgressDialog progress;

    public MyWebViewClient(Context context){
        super();
        progress = new ProgressDialog(context);
        progress.setMessage("Now Loading...");
    }

    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        progress.show();
    }

    public void onPageFinished(WebView view, String url){
        if(progress != null && progress.isShowing()){
            progress.dismiss();
        }
        progress = null;
    }
}

前回との変更は、まずコンストラクタの引数にContextが付いていること。
次に、progressをコンストラクタで宣言している点になります。

まず、Contextに関してですが、前回は
public void onPageStarted(WebView view, String url, Bitmap favion){
  progress = new ProgressDialog(view.getContext());
  progress.setMessage(message);
  progress.show();
}

としておりました。
問題はview.getContext()時に発生。
getContext()で呼ばれるContextではなく、Activityを指定する必要があります。
なので、コンストラクタで指定しております。

呼び出し方は

ActivityMain.java

WebView wv = (WebView)findViewById(R.id.web_view);
wv.setWebViewClient(new MyWebViewClient(this));

wvはグローバル変数にしておりますが、わかりやすくローカルで書いています。
この2行をonCreate()で呼んで完成です。
wv.loadUrl()は別の関数内なので、wvはグローバルの方が良いと思います。

改訂版を使用しているClick2Goをよろしくお願いします。