画面回転したときなどにダイアログの中身を保持する方法

ダイアログは画面が回転したときなどは再生成されずに消されてしまいます。なぜかというとアクティビティが再構築されたときにダイアログがすべて破棄されるようになっているからです。

そこでActivity内でダイアログにIDを割り振ってアクティビティ側でダイアログを管理する方法を利用します。手順は次の通りです。

  1. showDialogメソッドでダイアログ表示を開始する。
  2. onCreateDialogメソッドが呼ばれる。
  3. その後onPrepareDialogメソッドが呼ばれる。
  4. もしダイアログを消したかったらremoveDialogdismissDialogメソッドを呼ぶ。

showDialogメソッドにはダイアログのIDを渡し、onCreateDialogでIDに応じてそれぞれのダイアログを表示します。

onCreateDialogメソッドではまだダイアログは表示されません。そしてその後のonPreapreDialogではダイアログを表示した後と同じ状態になるのでボタンなどのビューを取得することができます。

またダイアログを消すには2種類の方法があります。2つのメソッドの違いはダイアログを再表示したとき、removeDialogメソッドではonCreateDialogメソッドが再度呼ばれ、dismissDialogメソッドではそれは呼ばれないという違いがあります。

ダイアログの表示例

では実際に紹介した手順でダイアログを表示してみます。

public class MainActivity extends Activity 
{

    final int MY_DIALOG_ID = 0;

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

    @Override
    public void onStart()
    {
        super.onResume();
        
        showDialog(MY_DIALOG_ID);
            //ダイアログの表示開始
    }

    @Override
    /**showDialogが呼ばれたら実行される*/
    public Dialog onCreateDialog(int id)
    {
        Dialog dialog = null;
        switch(id){
        case MY_DIALOG_ID:
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            final View dialogView = LayoutInflater.from(context)
                                            .inflate(R.layout.my_dialog, null);
        
            builder.setTitle(R.string.dialog_title)
                .setView(dialogView)
                .setPositiveButton(R.string.ok_str,
                new DialogInterface.OnClickListener() 
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which) 
                    {}
                })
            });
        
            dialog = builder.create();
        }

        return dialog;
    }

 	/**表示されたダイアログの設定をする*/
	@Override
	public void onPrepareDialog(int id, Dialog dialog)
	{
		super.onPrepareDialog(id, dialog);

		switch(id){
		case MY_DIALOG_ID:
			//ダイアログが表示された直後の処理
			break;
		}
	}
}

ダイアログのID(ここではMY_DIALOG_ID)をshowDialogに渡すことでonCreateDialogが呼ばれるので渡されたIDに応じてダイアログを生成します。

一度生成されたダイアログは画面回転しても再生成されるため入力された内容などを保持できるようになっています。

回転前回転後
回転前のダイアログ回転後のダイアログ
関連項目
プライバシーポリシー