Android3.0以降でDatePickerDialogの使い方というか、Fragmentでの使用となり、Android2.3.3以前のソースをコピペしても動かず。
半日ほどハマったので備忘録も兼ねて。
Android3.0以降だと、Fragmentでダイアログを表示するんだけど、さっぱり分からず。
というかonCreateViewで各レイアウトを読み込んでいるんだけど、そうするとonCreateはレイアウトが読み込まれる前なので、setOnClickListenerとかが書けない。
は?
って感じで。
じゃいつものsetOnClickListenerとかどこに書くのよ!?ってのに半日ほどハマりました。
で、突破口のエントリーを見つけました。感謝感謝。
Fragment上のonClickとかをFragment内で受け取る
ということで、一気にプログラミングが進みました。
Android3.0以降でDatePickerDialogを扱う場合はこんな感じ。
※フラグを追加しないとダイアログが二重や三重で起動してしまうので、その辺も考慮してます。
端末のロケールとシステム日付を取得して、各国の日付フォーマットを出力しています。
bDateDialogってのが、二重起動防止フラグ。
ダイアログ表示時にtrueにしてDialogのonDismiss時(doneタップ時)にクリアしています。
public static class MainSectionFragment extends Fragment { /** * The fragment argument representing the section number for this * fragment. */ public static final String ARG_SECTION_NUMBER = "section_number"; // 日付設定 int[] iYmd = Common.getNowDateInt(); public MainSectionFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = null; (中略) return rootView; } @Override public void onStart() { super.onStart(); mYear = iYmd[0]; mMonth = iYmd[1]; mDay = iYmd[2]; // 日付テキスト editDate = (EditText) getActivity().findViewById(R.id.editDate); editDate.setKeyListener(null); editDate.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (!bDateDialog) { dateDialog = new DateDialogFragment(); dateDialog.show(fragmentManager, "dialog"); } // 二重起動防止フラグ bDateDialog = true; } }); // 画面上に日付設定 updateDisplay(iYmd[0], iYmd[1], iYmd[2]); // 日付ダイアログ初期化 mDateSetListener = new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { mYear = year; mMonth = monthOfYear; mDay = dayOfMonth; updateDisplay(mYear, mMonth, mDay); } }; } /** * 日付を設定する * * @param 年月日 * year(int) month(int) day(int) * @return 無し * @see * */ private void updateDisplay(int year, int month, int day) { String sDate = Common.getLocalDate(getActivity(), year, month, day, Common.DATE_FORMAT_MEDIUM); editDate.setText(sDate); }
んでDialogFragment。
public static class DateDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new DatePickerDialog(getActivity(), mDateSetListener, mYear, mMonth, mDay); } /** * 日付ピッカーで「done」タップ時 * * @param ダイアログ * dialog(DialogInterface) * @return 無し * @see * */ @Override public void onDismiss(final DialogInterface dialog) { super.onDismiss(dialog); bDateDialog = false; } }
いや、分かってしまえば何てことないんだけど。
DatePickerDialogとかでハマる人結構いると思うんですね。何かの役に立てば。
株式会社woodsmallの小林でした。
https://woodsmall.co.jp/
コメント