[Android] DatePickerDialogで年から選ばせるようにする方法


この記事について

この記事では、DatePickerDialogの初期表示が月日の選択であることによる問題と、DatePickerDialogで年から選ばせるようにする方法について書きます。

DatePickerDialogの初期表示は月日の選択

まず、以下のようなDatePickerDialogを使ったDialogFragmentの表示を考えます。

class DatePickerDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return DatePickerDialog(activity, null, 2018, 3, 29)
    }
}

このDialogFragmentは、APIレベル21(Lollipop)以降の端末で以下のように表示されます。

ここで、皆さんに問題です。たとえば「2000/4/29」という生年月日を入力する場合、2018年となっているところを2000年に変えたいですよね。年を変えたい時、ユーザーはどこをタップすれば良いでしょうか?

正解は、ここです。

水色の枠で囲んでいる年表示の部分をタップすると、以下のスクショのように年の選択モードになります。年を選択すると、月日の選択モードに戻ります。

めっちゃ、わかりにくくないですか?
ユーザーによっては年表示に切り替えられることに気づかずに、頑張って2000年までスワイプしてしまうかもしれません。

DatePickerDialogで年から選ばせる

そこで、最初から年選択の状態にしておけば、ユーザーは迷わず年を入力できると考えました。DatePickerDialogに選択モードを切り替えるメソッドは残念ながら提供されていませんでしたが、StackOverFlowに解決策がありました。
https://stackoverflow.com/a/46223200

以下のように年表示の部分をクリックするコードを書いてやれば、最初から年選択モードで表示できます。

class DatePickerDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val datePickerDialog = DatePickerDialog(activity, null, 2018, 3, 29)

        // 年の選択モードにする
        // Lollipop以前はspinnerモードなのでこの処理は不要
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            datePickerDialog.datePicker.touchables[0].performClick()
        }
        return datePickerDialog
    }
}

ただし、OSバージョンアップなどでDatePickerDialogの仕様が変わって、年表示のViewの位置が変わってしまった場合は、この方法は使えなくなると思われるので注意してください。

以上です。