Androidで進捗状況や処理待ちのダイアログを表示するには、ProgressDialogを使います。
時間のかかる処理を行なっている間にProgressDialogを表示することで、「処理中である」ということを知らせることができます。
ProgressDialogを表示するために重要なクラスはイカのクラスです。
クラス | 説明 |
---|---|
ProgressDialogクラス | 実際に表示されるProgressDialog |
Threadクラス | ProgressDialog表示中に行う処理を管理する |
Handlerクラス | UIを処理する |
また、ProgressDialogが持っている重要なメソッドは、イカのものがあります。
メソッド | 説明 |
---|---|
setTitle | タイトルを設定する |
setMessage | メッセージを設定する |
setProgressStyle | スタイルを設定する |
setMax | 最大値を設定する |
setButton | プログレスダイアログにボダンを設置する |
show | プログレスダイアログを表示する |
dismiss | プログレスダイアログを閉じる |
ProgressDialog.setButton
ProgressDialogのボタンにはポジティブボタンとネガティブボタンの2種類があります。
それぞれのボタンの設定は、上記表で記したProgressDialogクラスのsetButtonで設定することができます。
具体的には、イカのようにします。
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
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
@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
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」でした。