前回は時間や処理量が不確定の場合に使用する「円」のプログレスをご紹介しました。今回は進捗率を示して表示を行う「バー」のプログレスをタイトルバーに表示してみます。
◆ プログレス(バー)の表示
ProgressBarOnTitleBarTest1aActivity.java
package jp.co.triware.samples.ProgressBarOnTitleBarTest1a; 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 ProgressBarOnTitleBarTest1aActivity extends Activity { // プログレスバーの更新周期(100)から増分値を設定 private static final int progressPeriod = (Window.PROGRESS_END - Window.PROGRESS_START) / 100; private int progressUpdate; private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // タイトルバーにプログレスバーを設定する requestWindowFeature(Window.FEATURE_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) { progressUpdate = 0; // プログレスバー表示開始 setProgressBarVisibility(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) { ; } // プログレスバーの進捗率計算 progressUpdate += progressPeriod; handler.post(new Runnable() { public void run() { // プログレスバーを更新する setProgress(progressUpdate); } }); } handler.post(new Runnable() { public void run() { // プログレスバー表示終了 setProgressBarVisibility(false); Toast.makeText(getApplicationContext(), "Done.", Toast.LENGTH_SHORT).show(); } }); } }; }
今回も、プログレスを10秒間表示して終了することにします。プログレスの進捗状況の更新は100ms毎に100回行うことによって0~100%までを表すことにします。
プログレスへの設定値ですが、これはWindowクラスの定数PROGRESS_STARTとPROGRESS_ENDで定義されています。この差を更新回数で割った値が1回にプログレスに設定する値となります。13行目で、progressPeriodにこの値を定義しています。
タイトルバーにプログレスバーを設定している箇所が21行目です。
requestWindowFeature(Window.FEATURE_PROGRESS);
前回同様に、このAPI、requestWindowFeature()は、setContentView()の前に呼び出す必要があります。
次に設定したプログレスバーを表示しているのが33行目です。setProgressBarVisibility(true);
これ以降、タイトルバーにバーのプログレスが表示されます。
処理が終了してプログレスの表示を消しているのは、67行目です。
setProgressBarVisibility(false);
プログレスバーの更新は、59行目のsetProgress(progressUpdate);で行っています。更新で注意して頂きたいのは、一番最後のsetProgressの呼び出しにおいてPROGRESS_STARTとPROGRESS_ENDの差である10000がセットされるようにすることです。この値が設定されるとプログレスバーはフェードアウトして消えていきます。もし10000より小さい値でsetProgressを呼び出した後に、setProgressBarVisibility(false);を呼び出すと、プログレスバーは瞬時に消えてしまいます。フェードアウトしたほうが綺麗ですよね。
それと、今回のサンプルだけでなくUIに影響を与える処理についてはUIを処理しているスレッドで行うようにしてください。もし別スレッドからUIを触るような処理をした場合、例外が発生してしまいます。幾つかの方法がありますが、プログレス関連のサンプルではハンドラを使用して、各APIがUIスレッドで実行されるようにしています。
画面レイアウトはボタンのラベル(テキスト)を除いて前回と同じです。
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 ProgressBar on TitleBar" /> </LinearLayout>
Androidプロジェクトの設定
ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。
プロジェクト名: ProgressBarOnTitleBarTest1a アプリケーション名: ProgressBarOnTitleBarTest1a パッケージ名: jp.co.triware.samples.ProgressBarOnTitleBarTest1a アクティビティーの作成: ProgressBarOnTitleBarTest1aActivity
実行結果
プログレスバーは100回更新されます。
10秒間待つとプログレスバーがフェードアウトして消えます。
0 件のコメント:
コメントを投稿