Android 処理中インジゲーターを表示する


導入

ProgressDialogはdeprecatedになったので、ProgressBarを使用する

<ProgressBar
    style="?android:attr/progressBarStyle"
    android:id="@+id/progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="invisible" />

style="?android:attr/progressBarStyle"でくるくる回るインジゲーターや横棒の進捗バーを指定できる。

あとはコード側で処理開始時と終了時に表示制御すればよい。

//処理開始 インジゲーターを表示
progressBar.visibility = android.widget.ProgressBar.VISIBLE
doAction()
//処理終了 インジゲーターを非表示
progressBar.visibility = android.widget.ProgressBar.INVISIBLE

非同期処理中にインジゲーターを表示する

尚、上記例のdoAction()が非同期処理の場合、処理が終わる前にINVISIBLEとなるので、doAction()完了時のコールバックにINVISIBLEを渡す必要がある。

progressBar.visibility = android.widget.ProgressBar.VISIBLE
doAction{
    progressBar.visibility = android.widget.ProgressBar.INVISIBLE
}

また、当然ながらProgressBarはUIスレッド上で操作するので、progressBar.visibility = android.widget.ProgressBar.VISIBLEをワーカースレッドで設定するとクラッシュする。

WebViewのローディングに合わせてインジゲーターを表示する

WebViewにはローディングの開始と終了時のコールバックがあるので、そちらにインジゲータの処理を記述する。

webView.webViewClient = object: WebViewClient(){
    override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
        progressBar.visibility = android.widget.ProgressBar.VISIBLE
        super.onPageStarted(view, url, favicon)
    }
    override fun onPageFinished(view: WebView?, url: String?) {
        progressBar.visibility = android.widget.ProgressBar.INVISIBLE
        super.onPageFinished(view, url)
    }
}
webView.loadUrl( url )

またロード開始時はonPageStartedでキャッチするのだが、PDFファイル等WebViewがロードできないファイルに対してはキャッチできない。その場合はshouldOverrideUrlLoadingを使用する。shouldOverrideUrlLoadingは逆にPOSTからのレスポンス読み込みに対応したてないので必要に応じて切り替えを行おう。

参考 re-engines.com