ブログ

FragmentでDatePickerDialogを使う

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の小林でした。
http://woodsmall.co.jp/

スポンサードリンク

  • このエントリーをはてなブックマークに追加

関連記事

スポンサードリンク

 

30代半ばのオッサンが起業した話

プロフィール

kobayashi-profile
代表取締役CEO 小林 高志
1999年からシステムエンジニアとして、クライアントサーバのシステム構築、WEBシステムの開発、Androidアプリの企画・開発、iPhoneアプリの企画・マーケティング等に携わる。
2012年からカメラマンとして都内のスタジオに従事。
2012年、株式会社woodsmall創業。
2013年5月に代表取締役に就任。
自身の半生を綴った書籍を出版するのが、個人的な目標。
趣味は、カメラ・車・バイク・料理。

代表取締役の略歴はこちら

社長のブログについて

検索してもヒットしなかったアプリ開発に関する技術的な記事から、その時に思ったことなどを素直に書き綴っています。

スポンサードリンク

Facebook

twitter

対応エリア

株式会社woodsmallは、千葉県をはじめ関東エリア、関西エリアでのホームページ制作、アプリ開発(Android、iPhone)、システム開発、チラシ制作を承ります。

【千葉県エリア】
船橋市、市川市、習志野市、浦安市、鎌ヶ谷市、松戸市、柏市、成田市、佐倉市、千葉市中央区、千葉市花見川区、千葉市稲毛区、千葉市美浜区、千葉市若葉区、千葉市緑区、白石市などの千葉県エリア

【東京都エリア】
足立区、荒川区、板橋区、江戸川区、大田区、葛飾区、北区、江東区、品川区、渋谷区、新宿区、杉並区、墨田区、世田谷区、台東区、中央区、千代田区、豊島区、中野区、練馬区、文京区、港区、目黒区などの東京都エリア

【神奈川県エリア】
横浜市、川崎市、藤沢市、茅ヶ崎市、大和市、海老名市、座間市、綾瀬市、平塚市、寒川町、大磯町、二宮町などの神奈川県エリア

【埼玉県エリア】
さいたま市、川口市、蕨市、戸田市などの埼玉県エリア

【関東・関西エリア】
その他、茨城県、栃木県、群馬県の関東エリア、長野県、新潟県の甲信越エリア、大阪府の関西エリア、全国からのご依頼に対応させて頂きます。
(遠方の場合は電話やメール、LINE、Skypeでの打合せとなります。)

ページ上部へ戻る