Loading画面を作成する(Android)

Androidでローディング画面を出す方法です。

イメージとしては以下のようなものを表示させます。

実装するローディング画面

loading image

まずはローディング画面レイアウトを作成します。

ロード画面のレイアウト

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_gravity="center"
                android:background="@android:color/transparent" >
    <ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />
</RelativeLayout>

さらにそれを使うクラスを作成します。
動きを管理したいのでコンストラクタ以外にshowとcloseがあります。

ロード画面表示用クラス

public class Loading {
    Context mContext;
    ProgressDialog mProgressDialog;

    public Loading(Context context){
        mContext = context;
        mProgressDialog = new ProgressDialog(context);
    }
    public void show(){
        mProgressDialog.show();
        mProgressDialog.setContentView(R.layout.loading);
        mProgressDialog.setCancelable(false);
    }
    public void close(){
        mProgressDialog.dismiss();
    }
}

そしてActivity などでボタンのクリックイベントでローディング画面を表示します。

ローディングの表示、非表示

        final Context self = this;
        ((Button)findViewById(R.id.button))
        .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Loading loading = new Loading(self);
                loading.show();
            }
        });

これでローディング画面が出来ました。

実際は重い処理が始まる前に表示して終わったら消す感じにしたいので
以下のようになると思います。

ローディングの表示、非表示(同期)

        final Context self = this;
        ((Button)findViewById(R.id.button))
        .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final Loading loading = new Loading(self);
                loading.show();
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        // なんらかの重い処理
                        loading.close();
                    }
                }, 1000);
            }
        });

AsyncTask を利用しての非同期処理ではこんな感じです。

ローディングの表示、非表示 (非同期)

        final Context self = this;
        ((Button)findViewById(R.id.button))
        .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final Loading loading = new Loading(self);
                AsyncTask<Void, Void, Boolean> task = 
                	new AsyncTask<Void, Void, Boolean>() {
                    @Override
                    protected void onPreExecute(){
                        loading.show();
                    }
                    @Override
                    protected void onPostExecute(Boolean result) {
                        loading.close();
                    }
                    @Override
                    protected Boolean doInBackground(Void... params) {
                        // 重い処理
                        try{
                            Thread.sleep(1000);
                        }catch(InterruptedException e){
    
                        }
                        return Boolean.TRUE;
                    }
                };
                task.execute();
            }
        });