DatePickerを使ってカレンダーから日付を選択する


日付を入力するためのWidgetでDatePickerクラスがあります。このクラスはAPI Level 1から存在していますが、Honeycomb(API Level 11)で機能が追加されました。

今回はその変化点について説明します。

DatePickerは日付を入力するためのWidgetですが、API Level 10まではスピナー(Spinner)で日付を選択するものでしたがが、API Level 11からはCalendarViewクラスが追加されたこともあり、DatePickerでカレンダーを表示して日付を選択することが可能になりました。

3.0以前
3.0以降

それでは続きで説明します。

DatePickerクラス

DatePickerクラスを利用する方法は以前と同様です。
例えばレイアウトファイルに記述する場合は以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
 <DatePicker android:id="@+id/datePicker"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">
 </DatePicker>
</LinearLayout>

これで実行すると、スピナーとカレンダーが並んで表示されます。

どちらかだけで良い場合は要素に下記を追加します。

  • android:calendarViewShown=”falsae”
  • android:spinnersShown=”falsae”

例えばカレンダー表示だけにしたい場合は下記のように記述します。

<DatePicker android:id="@+id/datePicker"
 android:spinnersShown="falsae"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">
 </DatePicker>

動的に表示を変える方法

レイアウトファイルの要素でスピナー、カレンダーの表示、非表示を変える方法を示しましたが、ソースコード上で設定することにより動的に変更することも可能です。
API Level 11から追加されたメソッドで以下のものがあります。

void     setCalendarViewShown(boolean shown)
void     setSpinnersShown(boolean shown)

それぞれ、カレンダーとスピナーの表示、非表示を切り替えます。

DatePicker datePicker = (DatePicker)findViewById(R.id.datePicker);
datePicker.setCalendarViewShown(true);
datePicker.setSpinnersShown(false);

このように記述するとカレンダーを表示、スピナーを非表示することになります。

サンプルソースではトグルボタンを押すことで表示を切り替えています。

選択できる日付の範囲の設定

DatePickerクラスにAPI Level 11から追加されたAPIには選択できる日付の範囲を設定するためのものもあります。

範囲の設定

void 	setMaxDate(long maxDate)
void 	setMinDate(long minDate)

設定されている範囲の取得

long 	getMaxDate()
long 	getMinDate()

設定する値、取得する値ともにlong型となっていますが、この値は1970年1月1日からの経過時間(単位:ミリ秒)になります。

デフォルトでは1900/1/1 〜 2200/12/31となっているので、ここでは2011/1/1 〜 2011/12/31に設定してみます。

DatePicker datePicker = (DatePicker)findViewById(R.id.datePicker);
Date minDate = new Date(111, 0, 1);
Date maxDate = new Date(111, 11, 31);
datePicker.setMinDate(minDate.getTime());
datePicker.setMaxDate(maxDate.getTime());

※Dateクラスのコンストラクタで日付を設定していますが、第1引数での年の指定は0が1900年です。また、第2引数の月は0が1月となります。