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