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」でした。