2011年3月10日木曜日

Androidで格好いいプログレスダイアログを表示する

完成形


通常のプログレスダイアログ


ニュートラルな状態


Androidアプリケーションを作っていると、通信などでユーザーを待たせる場面がでてくる。こんな時にはプログレスダイアログを表示してあげると良いだろう。しかし、いつでもどこでも通常のプログレスダイアログ(上図)を表示しているとちょっとダサい。特にメッセージとして「通信中」と表示しているだけなら、もうメッセージいらないんじゃね?

若干無理がある導入はここまでにして、、、以下が今回必要な定義。
  • レイアウト
  • テーマ
  • ダイアログクラス

レイアウトの定義


構成はこんな感じ
  • FrameLayout
    • ProgressBar

res/layout/custom_progress_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  
  <ProgressBar
    android:id="@android:id/progress"
    style="@android:style/Widget.ProgressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:max="10000"
    android:layout_marginRight="12dip" />

</FrameLayout>


テーマの定義


タイトルを削除し、背景を透明に設定したダイアログテーマを定義する

res/values/themes_custom_progress_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style
    name="Theme.CustomProgressDialog"
    parent="android:style/Theme.Dialog">
    
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
  
  </style>
</resources>


ダイアログクラスの定義


定義したテーマとレイアウトでダイアログを初期化するクラスを定義
public class CustomProgressDialog extends Dialog
{
  /**
   * コンストラクタ
   * @param context
   */
  public CustomProgressDialog(Context context)
  {
    super(context, R.style.Theme_CustomProgressDialog);

    // レイアウトを決定
    setContentView(R.layout.custom_progress_dialog);
  }
}


使い方


使い方は簡単

但し、実際に利用する場合は、dialog.setCancelable(true)とか、AsyncTaskなどを使って処理完了後にdialog.dismiss()とかが必要になるはず。
CustomProgressDialog dialog = new CustomProgressDialog(MyActivicty.this);
dialog.show();

0 件のコメント:

コメントを投稿