2011年12月9日金曜日

ProgressDialog (バー)

前回からの続きです。

前回は「円」のProgressDialogをご紹介しました。今回は「バー」のProgressDialogです。

画面レイアウトは前回と同じです。

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <Button
        android:id="@+id/start_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Start ProgressDialog"
        />
</LinearLayout>

ProgressDialogTest1cActivity.java
package jp.co.triware.samples.ProgressDialogTest1c;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class ProgressDialogTest1cActivity extends Activity {
    private ProgressDialog mProgressDialog = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btnStart = (Button)findViewById(R.id.start_btn);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // プログレスダイアログを生成
                mProgressDialog = new ProgressDialog(ProgressDialogTest1cActivity.this);
                // タイトルを設定
                mProgressDialog.setTitle("ProgressDialog (Progress)");
                // スタイルをプログレスバーに設定
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                // メッセージを設定
                mProgressDialog.setMessage("しばらくお待ちください...");
                // Backボタンによるキャンセル可
                mProgressDialog.setCancelable(true);
                // ボタンを設定(ボタンクリックでダイアログキャンセル)
                mProgressDialog.setButton(ProgressDialog.BUTTON_POSITIVE, "Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 既に閉じられている場合は何もしない
                        if (mProgressDialog == null) {
                            return;
                        }
                        // ダイアログキャンセル処理呼出
                        mProgressDialog.cancel();
                    }
                });
                // キャンセル時に呼び出されるリスナーを設定
                mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialog) {
                        // 既に閉じられている場合は何もしない
                        if (mProgressDialog == null) {
                            return;
                        }
                        // ダイアログキャンセル時の処理
                        Toast.makeText(getApplicationContext(), "Cancelled.", Toast.LENGTH_SHORT).show();
                        mProgressDialog = null;
                    }
                });
                // ダイアログ終了時に呼び出されるリスナーを設定
                mProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        // 既に閉じられている場合は何もしない
                        if (mProgressDialog == null) {
                            return;
                        }
                        // ダイアログ終了時の処理
                        Toast.makeText(getApplicationContext(), "Done.", Toast.LENGTH_SHORT).show();
                        mProgressDialog = null;
                    }
                });
                // プログレスバーの最大値を設定
                mProgressDialog.setMax(100);
                // ダイアログ表示
                mProgressDialog.show();
                // ダイアログ表示中の処理(別スレッドで実行)
                (new Thread(runnable)).start();
            }
        });
    }

    // 1秒毎に進捗状況を更新する(10秒間)
    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            try {
                // テストのために、ダイアログを表示してから処理を開始するようにウェイト
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                ;
            }
            // 既に閉じられている場合は何もしない
            if (mProgressDialog == null) {
                return;
            }
            // プログレスバーの初期値を設定
            mProgressDialog.setProgress(0);
            // プログレスバー更新
            for (int i = 0; i < 10; i ++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    ;
                }
                if (mProgressDialog == null) {
                    // 既に閉じられている場合はループ脱出
                    break;
                }
                // プログレスバーを10ずつ増やす
                mProgressDialog.incrementProgressBy(10);
            }
            if (mProgressDialog != null) {
                // 閉じられていなければダイアログを閉じる
                mProgressDialog.dismiss();
            }
        }
    };
}

28行目のmProgressDialog.setProgressStyle()でProgressDialogの種類(STYLE_HORIZONTAL)を指定しています。

進捗状況は百分率(パーセンテージ)と分数(m/n)の形で表示します。10段階の処理であれば最大値を10に、4段階の処理であれば最大値に4をセットします。百分率と同じく100をセットしてもかまいません。処理に応じて分母を決め、処理が完了した時点で分子をセットしていきます。最大値(分母)はsetMax()メソッドで設定します(最大10,000)。進捗状況(分子)はsetProgress()メソッドで直接値をセットします。また一定間隔ごとに増加させるにはincrementProgressBy()メソッドを使用します。
このサンプルプログラムでは、96行目で初期化するためにsetProgress()を、109行目でincermentProgressBy()を使って、進捗状況をセットしています。

また、「Cancel」ボタンを作成し、キャンセル処理を実行するようにしました。

実行結果

「0% 0/100」から始まり、20%の時点でバーと「20/100」を表示します。

100%まで進むと"Done."のToast表示を実行し、「Cancel」ボタンクリック時には"Cancelled."をToast表示します。

ProgressDialogTest1d.java
package jp.co.triware.samples.ProgressDialogTest1d;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class ProgressDialogTest1dActivity extends Activity {
    private ProgressDialog mProgressDialog = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btnStart = (Button)findViewById(R.id.start_btn);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // プログレスダイアログを生成
                mProgressDialog = new ProgressDialog(ProgressDialogTest1dActivity.this);
                // タイトルを設定
                mProgressDialog.setTitle("ProgressDialog (Secondary)");
                // スタイルをプログレスバーに設定
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                // メッセージを設定
                mProgressDialog.setMessage("しばらくお待ちください...");
                // Backボタンによるキャンセル可
                mProgressDialog.setCancelable(true);
                // ボタンを設定(ボタンクリックでダイアログキャンセル)
                mProgressDialog.setButton(ProgressDialog.BUTTON_POSITIVE, "Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 既に閉じられている場合は何もしない
                        if (mProgressDialog == null) {
                            return;
                        }
                        // ダイアログキャンセル処理呼出
                        mProgressDialog.cancel();
                    }
                });
                // キャンセル時に呼び出されるリスナーを設定
                mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialog) {
                        // 既に閉じられている場合は何もしない
                        if (mProgressDialog == null) {
                            return;
                        }
                        // ダイアログキャンセル時の処理
                        Toast.makeText(getApplicationContext(), "Cancelled.", Toast.LENGTH_SHORT).show();
                        mProgressDialog = null;

                    }
                });
                // ダイアログ終了時に呼び出されるリスナーを設定
                mProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        // 既に閉じられている場合は何もしない
                        if (mProgressDialog == null) {
                            return;
                        }
                        // ダイアログ終了時の処理
                        Toast.makeText(getApplicationContext(), "Done.", Toast.LENGTH_SHORT).show();
                        mProgressDialog = null;
                    }
                });
                // プログレスバーの最大値を設定
                mProgressDialog.setMax(500);
                // ダイアログ表示
                mProgressDialog.show();
                // ダイアログ表示中の処理(別スレッドで実行)
                (new Thread(runnable)).start();
            }
        });
    }

    // 1秒毎に進捗状況を更新する(10秒間)
    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            try {
                // テストのために、ダイアログを表示してから処理を開始するようにウェイト
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                ;
            }
            // 既に閉じられている場合は何もしない
            if (mProgressDialog == null) {
                return;
            }
            // プログレスバーの初期値を設定
            mProgressDialog.setProgress(0);
            mProgressDialog.setSecondaryProgress(50);
            // プログレスバー更新
            for (int i = 0; i < 10; i ++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    ;
                }
                if (mProgressDialog == null) {
                    // 既に閉じられている場合はループ脱出
                    break;
                }
                // プログレスバーを50ずつ増やす
                mProgressDialog.incrementProgressBy(50);
                mProgressDialog.incrementSecondaryProgressBy(50);
            }
            if (mProgressDialog != null) {
                // 閉じられていなければダイアログを閉じる
                mProgressDialog.dismiss();
            }
        }
    };
}
こちらはセカンダリプログレスバーを使ったサンプルです。プログレスバーに加え、セカンダリプログレスバーを表示しています。先行して処理しているものの進捗状況について、セカンダリ値に指定すると、プログレスバーより薄めの色で進捗状況を表示します。セカンダリ値の指定には、setSecondaryProgress()やincrementSecondaryProgressBy()等のメソッドを使用します。

実行結果

セカンダリプログレスバーの色が少し薄いことがわかります。
下の数値は(セカンダリプログレスバーではなく)プログレスバーの状況を示しています。

0 件のコメント:

コメントを投稿