2013-05 / 2013-05-02

前のエントリ: Tone*Belをリリースしました [Android]
次のエントリ: pull to refreshを使う [jQueryMobile]

DialogFragmentでダイアログ表示
2013-05-02-1 / カテゴリ: [Android] / [permlink]

GB(Android2.3)までは、Activity#onCreateDialog(int) をOverrideしたメソッドで AlertDialog を作るようにしておいて、ダイアログを表示したい箇所で Activity#showDialog(int) すればOKだったけど、API level 13からこれらの実装は deprecated になってる。

どうするかと言うと、DialogFragment を使ってダイアログを表示する。
API 10以下(GB以下)の場合は、Support Packageを使えばOK。
画面部分にFragmentを使わない(使いたくない)場合でも、ダイアログのみの利用でも大丈夫。


基本はこんな感じ。
public class MainActivity extends Activity {

    protected static final String TAG = MainActivity.class.getSimpleName();

    private String string = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View btn3 = findViewById(R.id.dialog_fragment);
        btn3.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                showDialogFragment();
            }
        });
    }

    protected void showDialogFragment() {
        FragmentManager manager = getFragmentManager();
        DialogFragmentSample dialog = new DialogFragmentSample();
        dialog.show(manager, "dialog");
    }

    public static class DialogFragmentSample extends DialogFragment {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            Log.d(TAG, "tag: " + getTag());
            Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle("Fragment Dialog");
            builder.setMessage("フラグメントの\nダイアログの\nサンプル");
            builder.setPositiveButton("はい", null);
            builder.setNegativeButton("いいえ", null);
            AlertDialog dialog = builder.create();
            return dialog;
        }
    }
}

27行目以降でダイアログを表示するためのクラスを作成し、30行目のDialogFragment#onCreateDialog()で以前のActivity#onCreateDialog()に相当するダイアログ生成処理を実装する。
そして、表示したい箇所(23,24行目)で、このクラスのオブジェクトを作成してshow()を呼べばOK

Fragmentが標準で使用できるAPI11以上の場合はこのコードで大丈夫だけど、それ以前のAPI levelの場合はサポートパッケージ(android-support-v4.jar)を使う。
その場合は画面はActivityでなくFragmentActivity(android.support.v4.app.FragmentActivity)を継承し、
public class MainActivity extends FragmentActivity {
前述のコード22行目でActivity#getFragmentManager()で取得していたFragmentManager(android.app.FragmentManager)オブジェクトは、FragmentActivity#getSupportFragmentManager()での取得に変更(メソッド名が異なる/クラスはandroid.support.v4.app.FragmentManager)する。
    protected void showDialogFragment() {
        FragmentManager manager = getSupportFragmentManager();
        DialogFragmentSample dialog = new DialogFragmentSample();
        dialog.show(manager, "dialog");
    }

deprecatedだけどまいっか、と逃げようとしてたところ、そんなに難しくないよーと教えてくれた @patorash さんありがとうございました!
前のエントリ: Tone*Belをリリースしました [Android]
次のエントリ: pull to refreshを使う [jQueryMobile]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12