表題の通りなんだけれども。
最初全然気付かなかったんだけど、Ajax使ってるサイトとかで起きた。
WebViewClientを継承してロード中…みたいなProgressDialogを出そうと思ってやってみたら出来てたわけです。
しかし、YouTubeのサイトで画面タップしたら、いきなりエラーで落ちた。LogCat見たら、「onPageFinishedでpd.dismiss()ってやってるけど、ProgressDialogないよ!」って怒られてた。
ん?なんで一度onPageFinished終わってるのに再度呼ばれてるの?と疑問に思ったのだが、どうもAjaxでデータ取り終わった後にも呼ばれているっぽい。onPageStartedはAjax呼ばれた最初にはコールされないので、pdを初期化する処理が行われずに呼ばれるからエラーと。そうですか…。
ということで、以下のように改良。
public class HogeActivity extends Activity { . . . /** * WebViewのロード中にプログレスダイアログを表示するクラス * */ public class SimpleLoadingClient extends WebViewClient { private ProgressDialog pd; @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); this.dismissDialog(); } private void dismissDialog() { if (pd != null) { pd.dismiss(); pd = null; } } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); this.dismissDialog(); pd = new ProgressDialog(HogeActivity.this); pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); pd.setMessage(getString(R.string.now_loading)); pd.show(); } } }
pdがnullならdismissしないようにすると。
以上でーす。