toggle
暮らすように旅する。貧乏なノマド夫婦の海外放浪記。
2017-03-03

【Androidアプリ開発】ぐるぐる回るローディング中メッセージを表示する方法

ぐるぐる回る、「ロード中…」的なメッセージを表示します。

以下のようなものです。
そう、待機中であることを表示する、アレですね。

 

ナニコレ?

正式名称はProgressDialogと言います。
ググるときは、ProgressDialogでググってくださいね。

読んで字のごとく、進捗状況を表示するものです。

時間のかかる処理を行うとき、
画面が止まったままだと、ユーザーがアプリが(あるいはスマホそのものが)
壊れたんじゃないか、と思ってしまいますので、
「今、処理中ですよ~」ということを示して安心してもらうためのものです。

 

実装方法

基本

基本的には、以下のコードで実装します。

progressDialog = new ProgressDialog(this);
progressDialog.setTitle("タイトル");
progressDialog.setMessage("メッセージ");
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.show();

// 時間のかかる処理

progressDialog.dismiss();

①ProgressDialogのインスタンスを作成し、
②setTitleでタイトルをセット、
③setMessageでメッセージをセット、
④setProgressStyleで見た目を切り替えます。

showで表示し、
その後、時間のかかる処理を行います。

時間のかかる処理が終わったら、
dismissで消します。

setProgressStyleには、
ProgressDialog.STYLE_SPINNER
ProgressDialog.STYLE_HORIZONTAL
があります。

ProgressDialog.STYLE_SPINNER

 

ProgressDialog.STYLE_HORIZONTAL

 

非同期クラス内での実装

とまぁ、普通の教科書や説明サイトだとここまでしか書かれていないのですが、
私は思うわけです。

「時間のかかる処理に使うんだから、非同期クラスにどうやって組み込めば良いのか教えてよ!」
と。

ですので、ご説明いたします。

①まずは、Activityで、ProgressDialogのセッティングを行い、showで表示します。
そして、非同期クラスを実行します。
この時、引数にProgressDialogを渡します。

public class MainActivity extends AppCompatActivity {

    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("タイトル");
        progressDialog.setMessage("メッセージ");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.show();

        AsyncTaskClass task = new AsyncTaskClass(progressDialog);
        task.execute("");

    }

}

 

②次に、非同期クラス(AsyncTaskクラス)のコンストラクタで
Activityから送られてきたProgressDialogを受け取ります。
そして、doInBackgroundで時間のかかる処理を行い、
onPostExecuteで、dismissして消します。

public class AsyncTaskClass extends AsyncTask<String, String, String> {

    ProgressDialog progressDialog;

    public AsyncTaskClass(ProgressDialog progressDialog) {
        super();
        this.progressDialog   = progressDialog;
    }

    @Override
    protected String doInBackground (String... params) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) { }
        return "";
    }

    @Override
    protected void onPostExecute(String str) {
        progressDialog.dismiss();
    }
}

doInBackgroundはUIスレッドを操作できないので、
ここでshowやdismissを行わないことがポイントです。

ProgressDialog.STYLE_HORIZONTAL の場合

ProgressDialog.STYLE_SPINNER(ぐるぐる回るタイプ)の場合は、
処理中はただぐるぐるが回っていて、終わったらそれが消えるだけなので、
特に問題はないのですが、問題があるのはProgressDialog.STYLE_HORIZONTALのほうです。

これは、水平のゲージが表示されるタイプなので、
ゲージの進み具合に応じて●●%~と表示しなくてはなりません。

そうしないと、数字が0のまま、ゲージも進まないまま時間が経過し、
ダイアログがイキナリ消えるという、なんともポンコツなものになってしまいます。

初期設定

progressDialog = new ProgressDialog(this);
progressDialog.setTitle("タイトル");
progressDialog.setMessage("メッセージ");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100); // 最大値を設定
progressDialog.show();

setMaxで最大値を設定します。

進捗状況の反映(非同期クラスの場合)

@Override
    protected String doInBackground (String... params) {
        try {
            for (int i = 0; i < 100; i++) {
                progressDialog.setProgress(i);
                Thread.sleep(100);
            }

        } catch (InterruptedException e) { }
        return "";
    }

時間のかかる処理をしつつ、
setProgressで進捗ゲージに進捗状況を反映していきます。

これで、時間のかかる処理の進み具合に応じて、
伸びていくゲージが実装できるわけです。

関連記事

コメントを残す

メールアドレスが公開されることはありません。