【AndroidのViewを制する】 DatePickerを使いこなして日付選択スピナーを表示する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

Androidには日付を選択するためのViewが二つあります。
API Level 1から存在するDatePickerとAPI Level 11で追加されたCalendarViewです。
両方とも日付を選択する機能、カレンダーを表示する機能は同じですが、DatePickerにはスピナー表示があります。

DatePickerの選択モードを切り替える

DatePickerには2つの選択モードがあります。
スピナーモードとカレンダーモードです。
スピナーモードでは日付をスピナーとカレンダーを同時に表示し、日付を選択することができます。
カレンダーモードではマテリアルスタイルのカレンダーから日付を選択することができます。
API Level 21以前は、スピナーモードしか使用できませんでした。
API Level 21以降で、マテリアルテーマが選択されている場合デフォルトのレイアウトはカレンダーモードです。
このモードはDatePickerのXML属性の一つであるdatePickerModeで変更することができます。
また、DatePickerのメソッドにはスピナーモードでないと使用できないものが多数あります。
<!-- スピナーモード-->
<DatePicker
    android:id="@+id/date_picker"
    android:datePickerMode="spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<!-- カレンダーモード-->
<DatePicker
    android:id="@+id/date_picker"
    android:datePickerMode="calendar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

DatePicker#init

DatePicker#initは現在選択されている日付を引数で指定した日付に変更し、 選択された日付が変更された時に呼ばれるコールバックインターフェースを設定するメソッドです。
DatePicker datePicker = new DatePicker(this);
/**
* 第1引数 : 年を指定する
* 第2引数 : 月(0~11)を指定する
* 第3引数 : 日を指定する
* 第4引数 : 日付が変更された時に呼ばれるコールバックインターフェースを指定する
**/
datePicker.init(2000, 0, 1, new DatePicker.OnDateChangedListener() {
    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

    }
});

DatePicker#setEnabledとDatePicker#isEnabled

スピナーの選択機能の有効無効を設定するメソッドです。
引数にtrueを渡すとスピナーは回転しますが、falseを渡すとスピナーは回転しません。
また、DatePicker#isEnabledは、スピナー選択機能の有効無効を取得するメソッドです。
スピナーモードの時だけ効果があるメソッドです。
DatePicker datePicker = (DatePicker) findViewById(R.id.date_picker);
// スピナーの選択を無効にする
datePicker.setEnabled(true);

DatePicker#setCalendarViewShownとDatePicker#getCalendarViewShown

カレンダーの表示非表示を設定するメソッドです。
引数にtrueを渡すとカレンダーを表示しますが、falseを渡すとカレンダーは表示されません。
このメソッドを使用することで選択モードを変更できるわけではないので注意してください。
また、DatePicker#getCalendarViewShownは、カレンダーの表示非表示を取得するメソッドです。
スピナーモードの時だけ効果があるメソッドです。
このメソッドはAPI level 24で非推奨になっています。
DatePicker datePicker = (DatePicker) findViewById(R.id.date_picker);
// カレンダーを非表示にする
datePicker.setCalendarViewShown(false);

DatePicker#setFirstDayOfWeekとDatePicker#getFirstDayOfWeek

DatePicker#setFirstDayOfWeekを使うことでカレンダーの開始曜日を変更することができます。
DatePicker#setFirstDayOfWeekの引数はint型です、この引数にはCalendarの曜日定数を使用します。
また、DatePicker#getFirstDayOfWeekを使うことで現在設定されている週の開始曜日を取得することができます。
final DatePicker DatePicker = new DatePicker(this);
/**
* ・Calendarの曜日定数を使用する。
* ・Calendar.SUNDAY:日曜日
* ・Calendar.MONDAY:月曜日
* ・Calendar.TUESDAY:火曜日
* ・Calendar.WEDNESDAY:水曜日
* ・Calendar.THURSDAY:木曜日
* ・Calendar.FRIDAY:金曜日
* ・Calendar.SATURDAY:土曜日
**/
// 週の開始曜日を木曜日に変更する
DatePicker.setFirstDayOfWeek(Calendar.THURSDAY);

DatePicker#setMinDateとDatePicker#getMinDate

DatePickerはデフォルトでは無制限に過去までスクロールすることができます。
しかし、一定の過去までしかスクロールできないないように制御したいことがあります。
そこで使うのがDatePicker#setMinDateメソッドを使用します、引数はUNIX時間で指定します。
また、DatePicker#getMinDateを使うことで設定している日付を取得することができます。
final DatePicker DatePicker = new DatePicker(this);
// 一ヶ月前のUNIX時間を作成する。
Calendar minCalendar = Calendar.getInstance();
minCalendar.add(Calendar.MONTH , -1);
long minTimeInMills = minCalendar.getTimeInMillis();
// 遡れる制限を1か月前に制限する。
DatePicker.setMinDate(minTimeInMills);

DatePicker#setMaxDateとDatePicker#getMaxDate

DatePickerはデフォルトでは無制限に未来へスクロールすることができます。
しかし、一定の未来までしかスクロールできないように制御したいことがあります。
そこで使うのがDatePicker#setMaxDateメソッドを使用します、引数はUNIX時間で指定します。
また、DatePicker#getMaxDateを使うことで設定している日付を取得することができます。
final DatePicker DatePicker = new DatePicker(this);
// 一ヶ月後のUNIX時間を作成する。
Calendar maxCalendar = Calendar.getInstance();
maxCalendar.add(Calendar.MONTH , 1);
long maxTimeInMills = maxCalendar.getTimeInMillis();
// 遡れる制限を1か月前に制限する。
DatePicker.setMaxDate(maxTimeInMills);

DatePicker#setOnDateChangedListener

DatePicker#setOnDateChangedListenerは選択された日付が変更された時に呼ばれるコールバックインターフェースを設定するメソッドです。
Android O Developer Previewで使用できます。
DatePicker datePicker = new DatePicker(this);
/**
* 第1引数 : 日付が変更された時に呼ばれるコールバックインターフェースを指定する
**/
datePicker.setOnDateChangedListener(new DatePicker.OnDateChangedListener() {
    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

    }
});

DatePicker#setSpinnersShownとDatePicker#getSpinnersShown

スピナーの表示非表示を設定するメソッドです。
引数にtrueを渡すとスピナーを表示しますが、falseを渡すとスピナーは表示されません。
このメソッドを使用することで選択モードを変更できるわけではないので注意してください。
また、DatePicker#SpinnersShownは、スピナーの表示非表示を取得するメソッドです。
スピナーモードの時だけ効果があるメソッドです。
このメソッドはAPI level 24で非推奨になっています。
DatePicker datePicker = (DatePicker) findViewById(R.id.date_picker);
// スピナーを非表示にする
datePicker.setCalendarViewShown(false);

DatePicker#updateDate

DatePicker#updateDateは現在選択されている日付を引数で指定した日付に変更するメソッドです。
final DatePicker datePicker = new DatePicker(this);
/**
* 第1引数 : 年を指定する
* 第2引数 : 月(0~11)を指定する
* 第3引数 : 日を指定する
**/
datePicker.updateDate(2000,0,1);

DatePicker#getCalendarView

DatePicker#getCalendarViewはDatePicker内に存在するCalendarViewを取得するメソッドです。
スピナーモードの時だけ効果があるメソッドで、カレンダーモードの場合は例外が発生します。
このメソッドはAPI level 24で非推奨になっています。
final DatePicker datePicker = new DatePicker(this);
/**
* 第1引数 : 年を指定する
* 第2引数 : 月(0~11)を指定する
* 第3引数 : 日を指定する
**/
datePicker.updateDate(2000,0,1);

まとめ

グラフィカルではない簡易な日付選択が必要な場合は、DatePickerをスピナーモードで使用するといいでしょう。