2012年10月22日月曜日

【Android】プログレスダイアログのバーを2つにする

ファイルのコピーなどでダイアログ中に2つのプログレスバーを表示したいという需要があるかもしれない.
Androidが持っているProgressDialogはとてつもなく便利なモノではあるが,
ただ単にAlertDialogを継承してそこにプログレスバーと文字に依る進捗表示を付け足しただけである.

プログレスバーにはセカンダリ値が設定でき,一応は2本のバーを同一軸上に表示させることができる.
しかしこのセカンダリ値の最大値を個別で設定することはできず,プライマリの最大値を用いることになる.

例えば,ファイルをコピーするときに進捗ダイアログを表示させたい.
プログレスバーを2本用意し,
片方には 送信したファイル数/送信済みファイル数 の進捗
もう片方には 処理中ファイルの送信済みバイト数/ファイルのバイト数 の進捗
を表示させたい.
こういった場合,最大値がそれぞれ違うためAndroidのプログレスバーを適用できない.

いや,使うことはできなくはないのだが.
最大値を100(%)にして
片方には 送信したファイル数(%) の進捗
もう片方には 処理中ファイルの送信済みバイト数(%) の進捗
をプログレスバーに与えてやれば確かにプログレスバーの動作としては問題ない.

しかし,文字で表示される進捗は
○○% 進捗/最大値 というフォーマットで固定されているため
X% X/100
という重複した内容が表示されることになる.
更には,セカンダリバーの表示はプライマリバーの後ろに,同じ太さで表示されるため
プライマリバーがセカンダリバーの進捗を追い越すとセカンダリバーが見えなくなってしまう.

当然ながら上に重なって表示されるバーは下のバーより細くなくては両方見えない.

というわけで,AndroidのProgressDialogのソースを元に2本のプログレスバーを表示するダイアログを作ってみた.

まずはリソース.
/res/layout/view_dual_progress_dialog.xml



このソースではセカンダリバーが上に細く表示されることになる.


次に,セカンダリバーがプライマリバーと同じ色だと見えないし,
バー背景が見えていたらプライマリバーが欠損してるように見えるので
セカンダリバーの色を変更する.
/res/drawable/progress_secondary.xml



実機ではプログレスバーが何色に表示されるかは機種ごとに違うため,
プライマリバーも同様の方法で変更した方がいい.
実際にこの例の緑だとサムチョンギャラクシーSIIで色が被ってしまった.


そして本体のjava
DualProgressDialog.java



最低限の実装しかしていないので,AndroidのProgressDialog同等の実装をしたいのであれば
ここに追加していけばいい.


なお,このDualoProgressDialogの使い方は通常のProgressDialogとほぼ同じになっている.
違う点というと,
円形進捗バーの存在がないので,
setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
をする必要がなくなったという点と
セカンダリプログレスの最大値を設定する必要がある
という点.
この2点である.

0 件のコメント:

コメントを投稿