ProgressDialogの使い方/Getting Started
|Androidで進捗状況や処理待ちのダイアログを表示するには、ProgressDialogを使います。
時間のかかる処理を行なっている間にProgressDialogを表示することで、「処理中である」ということを知らせることができます。
ProgressDialogを表示するために重要なクラスはイカのクラスです。
クラス | 説明 |
---|---|
ProgressDialogクラス | 実際に表示されるProgressDialog |
Threadクラス | ProgressDialog表示中に行う処理を管理する |
Handlerクラス | UIを処理する |
また、ProgressDialogが持っている重要なメソッドは、イカのものがあります。
メソッド | 説明 |
---|---|
setTitle | タイトルを設定する |
setMessage | メッセージを設定する |
setProgressStyle | スタイルを設定する |
setMax | 最大値を設定する |
setButton | プログレスダイアログにボダンを設置する |
show | プログレスダイアログを表示する |
dismiss | プログレスダイアログを閉じる |
ProgressDialog.setButton
ProgressDialogのボタンにはポジティブボタンとネガティブボタンの2種類があります。
それぞれのボタンの設定は、上記表で記したProgressDialogクラスのsetButtonで設定することができます。
具体的には、イカのようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK" , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO 自動生成されたメソッド・スタブ Log.d( "test" , "BUTTON_POSITIVE clicked" ); } }); progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // ProgressDialog をキャンセル Log.d( "test" , "BUTTON_CANCEL clicked" ); dialog.cancel(); } }); |
ProgressDialogクラスのsetButtonの第1引数によって、ポジティブボタンかネガティブボタンの設定ができます。
ProgressDialogクラスのsetButtonの引数はイカの通りです。
第1引数:ポジティブボタンかネガティブボタンかを設定する
第2引数:ボタンの文字
第3引数:クリックリスナー
サンプルプログラム
それでは、実際にプログラムを見ていきましょう。
今回のサンプルプログラムでは、ProguressDialogを5秒間表示し、5秒後にProgressDialogを閉じたらToastを表示します。
Toastの使い方については、過去の記事「Toastを表示してユーザーに通知する/Getting Startted」を御覧ください。
まず、ProgressDialogを設定する処理を記載します。
■src/ProgressDialogActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | ProgressDialog progressDialog; Thread thread; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); progressDialog = new ProgressDialog( this ); progressDialog.setTitle( "タイトル" ); progressDialog.setMessage( "メッセージ" ); //progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK" , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO 自動生成されたメソッド・スタブ Log.d( "test" , "BUTTON_POSITIVE clicked" ); } }); progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // ProgressDialog をキャンセル Log.d( "test" , "BUTTON_CANCEL clicked" ); dialog.cancel(); } }); progressDialog.show(); thread = new Thread( this ); thread.start(); } |
11,12行目で、タイトルとメッセージを設定しています。
14行目で、ダイヤログのスタイルを設定しています。
今回はくるくる回るスタイルにしましたが、14行目をコメントアウトし、13行目のコメントアウトを外すと、バーのスタイルのダイヤログへ変更できます。
32行目で、ProgressDialogを表示しています。
35行目で、時間のかかる処理を開始しています。
それでは次に、時間のかかる処理を記載していきましょう。
今回は擬似的に、5秒間静止する処理にしました。
時間のかかる処理は、オーバーライドされたrun()メソッドに記載します。
ProgressDialogを使うにはRunnableをimplementsし、時間のかかる処理をrun()メソッドに書きます。
時間のかかる処理が終わった後、UI操作を行いたい場合は、Handlerクラスの中でUI操作をする処理を書きます。
■src/ProgressDialogActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Override public void run() { try { thread.sleep( 5000 ); } catch (InterruptedException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } progressDialog.dismiss(); handler.sendEmptyMessage( 0 ); } private Handler handler = new Handler() { public void handleMessage(Message msg) { Toast.makeText(getApplicationContext(), "slept 5 seconds" , Toast.LENGTH_LONG).show(); } }; |
4行目で、擬似的に5秒間静止しています。
5秒間の静止が終われば、9行目でProgressDialogを閉じています。
ProgressDialogを閉じたら、最後にToastを表示する処理を記載しているHandlerへ移動します。
ですが、UI操作を行うにはUIスレッドである必要があるため、Handlerクラスを使用して、UIスレッドで描画処理(Toast)を呼び出します。
Handlerクラスを使わなかった場合、「Only the original thread that created a view hierarchy can touch its views.」というエラーが出ます。
AndroidではActivityが持っているViewのみを変更できる形になっているため、上記エラーが出ます。
上記エラーを避けるために、Handlerを用います。
それでは、全体のソースコードです。
■src/ProgressDialogActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | public class ProgressDialogActivity extends Activity implements Runnable { ProgressDialog progressDialog; Thread thread; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); progressDialog = new ProgressDialog( this ); progressDialog.setTitle( "タイトル" ); progressDialog.setMessage( "メッセージ" ); //progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK" , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO 自動生成されたメソッド・スタブ Log.d( "test" , "BUTTON_POSITIVE clicked" ); } }); progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // ProgressDialog をキャンセル Log.d( "test" , "BUTTON_CANCEL clicked" ); dialog.cancel(); } }); progressDialog.show(); thread = new Thread( this ); thread.start(); } @Override public void run() { try { thread.sleep( 5000 ); } catch (InterruptedException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } progressDialog.dismiss(); handler.sendEmptyMessage( 0 ); } private Handler handler = new Handler() { public void handleMessage(Message msg) { Toast.makeText(getApplicationContext(), "slept 5 seconds" , Toast.LENGTH_LONG).show(); } }; } |
まとめ
ProgressDialogを使った処理の流れは、次の図のようになります。
もし時間のかかる処理の後にUIの操作が無い場合は、Handlerは必要ありません。
Dialogには他にも、AlertDialog等、様々なものがあります。
AlertDialogについては、過去の記事「ダイアログを表示する / Getting Started」を御覧ください。
以上、「ProgressDialogの使い方/Getting Started」でした。