2012年7月26日木曜日

タイトルバーにプログレス(円)の表示

以前に作業中であることを示すための方法として「ProgressDialog(円)」と「ProgressDialog(バー)」を紹介しました。

今回はこれらの情報をタイトルバーに表示してみることにします。
タイトルバーへのプログレス表示ですが、ProgressDialogでも説明しましたように、作業中であることを表現する方法は2つあります。時間や処理量が不確定の場合に表示するもの、もうひとつは進捗率を示して表示するものです。これからこれらそれぞれの場合について4種類のサンプルを作成していきたいと思います。

 円
 時間や処理量が不確定
 バー
 進捗率を示す
 バー(セカンダリ) 
 進捗率を示す
 バー(縞模様)
 時間や処理量が不確定

一つ目として、今回は時間や処理量が不確定の場合に円で表示するサンプルを作ります。


プログレス(円)の表示

ProgressIconOnTitleBarTest1aActivity.java
package jp.co.triware.samples.ProgressIconOnTitleBarTest1a;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

public class ProgressIconOnTitleBarTest1aActivity extends Activity {
    private Handler handler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // タイトルバーにプログレスアイコンを設定する
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.main);

        handler = new Handler();
        Button btnStart = (Button)findViewById(R.id.start_btn);
        btnStart.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // プログレスアイコン表示開始
                setProgressBarIndeterminateVisibility(true);
                Toast.makeText(getApplicationContext(), "Processing....", Toast.LENGTH_LONG).show();

                // プログレス表示中の処理(別スレッドで実行)
                (new Thread(runnable)).start();
            }
        });
    }

    // 10秒後にプログレスアイコンの表示を終了する
    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 100; i ++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    ;
                }
            }

            handler.post(new Runnable() {
                public void run() {
                    // プログレスアイコン表示終了
                    setProgressBarIndeterminateVisibility(false);
                    Toast.makeText(getApplicationContext(), "Done.", Toast.LENGTH_SHORT).show();
                }
            });
        }
    };
}
時間あるいは処理量が未定のサンプルですが、プログレスを10秒間表示して終了することにします。

最初に、タイトルバーに円のプログレスを設定している箇所が18行目です。requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
このAPI、requestWindowFeature()は、「タイトルバーを消す」で使用したAPIと同じで、 今回も同様にsetContentView()の前に呼び出す必要があります。

次に設定したプログレスを表示しているのが28行目です。
setProgressBarIndeterminateVisibility(true);
これ以降、タイトルバーの右端に円形のプログレスが表示されます。

処理が終了してプログレスの表示を消しているのは、52行目です。
setProgressBarIndeterminateVisibility(false);
今回は一定時間後 に当該APIを呼び出して、プログレスの表示を終了していますが、キャンセルする場合もボタンや他のイベント処理時に当該APIを呼び出すことになります。

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 ProgressIcon on TitleBar"
        />
</LinearLayout>

Androidプロジェクトの設定
プロジェクト名:ProgressIconOnTitleBarTest1a
アプリケーション名:ProgressIconOnTitleBarTest1a
パッケージ名:jp.co.triware.samples.ProgressIconOnTitleBarTest1a
アクティビティーの作成:ProgressIconOnTitleBarTest1aActivity
ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。

実行結果


プログレス表示中、タイトルバーの右端で円がくるくる回ります。


10秒間待つとプログレスの表示が消えます。

0 件のコメント:

コメントを投稿