DatePicker에서 생년월일을 입력할 수 있도록 허용

전제 조건



SDK 버전: 30
Android 버전 : 9.0

이 기사를 쓰려고 한 계기



Android DatePicker로 조사하면 거의 나오는 것이 캘린더 형식의 것으로 나는 상당히 곤란했습니다. 날짜를 선택할 때는 별도로 캘린더 형식에서도 문제 없다고 생각합니다만, 생년월일의 선택의 경우는 스피너, 혹은 드럼 롤이라고 불리는 타입의 형식이 훨씬 선택이 편합니다.
참고 : 【안전한 UI에 대해】android의 생년월일의 입력 폼으로 사용하지 말아야 하는 UI 디자인

만들고 싶은 것





이런 식으로 EditText를 클릭하면 생년월일을 선택하는 스피너가 표시되고 사용자가 선택하면 그 결과가 EditText에 반영된다는 흐름입니다.

DialogFragment 만들기



DatePickerDialog를 구현할 때 DialogFragment를 만드는 것이 좋습니다.
참고 : 선택 도구

코드는 이런 느낌입니다.

DatePickerFragment.kt
class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val c = Calendar.getInstance()
        val year = c.get(Calendar.YEAR)
        val month = c.get(Calendar.MONTH)
        val day = c.get(Calendar.DAY_OF_MONTH)

        var dp = DatePickerDialog(
            requireContext(),
            android.R.style.Theme_Holo_Dialog,
            this,
            year,
            month,
            day
        )

        dp.datePicker.calendarViewShown = false
        return dp
    }

    override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
        val editTxtBirthday = activity?.findViewById<EditText>(R.id.edit_txt_birthday)
        editTxtBirthday?.setText(String.format("%d/%02d/%02d", year, month+1, dayOfMonth))
    }
}

거의 공식 문서대로입니다 만, 말한다면
dp.datePicker.calendarViewShown = false

를 추가하고 있습니다.
만약 이것이 없으면 스피너와 캘린더의 양쪽 모두가 표시되어 버리므로, 캘린더 형식의 쪽을 삭제하고 싶다고 하는 의도입니다.

EditText를 클릭했을 때의 처리와 연계시킨다



activity_input_data.xml
<EditText
     android:id="@+id/edit_txt_birthday"
     android:layout_width="match_parent"
     android:layout_height="50dp"
     android:hint="生年月日"
     android:focusable="false"
     android:inputType="date"
     android:singleLine="true" />

InputDataActivity.kt
// 生年月日を入力するeditTextをクリックしたときの処理
binding.editTxtBirthday.setOnClickListener {
     val datePicker = DatePicker(this)
     datePicker.calendarViewShown = false
     showDatePickerDialog(binding.editTxtBirthday)
}

다른 방법이 있다면 알려주세요.



이것 실장해 보면 상당히 deprecated 투성이이므로, 다른 좋은 실장 방법이 있으면 꼭 가르쳐 주셨으면 한다!

좋은 웹페이지 즐겨찾기