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で設定することができます。

具体的には、イカのようにします。

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