Android - 연도와 월만 선택하는 Custom Datepicker Dialog 생성 및 활용 (Kotlin)

업데이트:

  • 연구주제 : Android - 연도와 월만 선택하는 Custom Datepicker Dialog 생성 및 활용 (Kotlin)
  • 연구목적 : 안드로이드에서의 코틀린 활용
  • 연구일시 : 2020년 03월 11일 09:00~17:00
  • 연구자 : 이재환 ljh951103@naver.com
  • 연구장비 : HP EliteDesk 800 G4 TWR, Kotlin, Android studio, IntelliJ
  • 관련연구 : Java, Android, Kotlin, Dialog


서론

개발중인 프로그램에서 연도와 달을 입력받아 검색하는 시스템이 있다.
기본 DatePicker은 년, 월, 일을 다 받기때문에 쓰기에 적합하지 않다.
따라서 우리는 연도와 월만 선택하는 Custom Datepicker Dialog를 생성해보고자 한다.


본론

저번 포스팅에서 다이얼로그에 대해 알아보았다.
DatePicker도 다이얼로그의 일종이기 때문에 원리는 똑같다.
다만 그 다이얼로그를 DatePicker처럼 만들어주어야 한다.

class YearMonthPickerDialog<Button : View?>(v: View, tag: String): DialogFragment() {
    private var listener: DatePickerDialog.OnDateSetListener? = null
    private final val MAX_YEAR = 2099
    private final val MIN_YEAR = 1980
    val v = v
    val tagname: String = tag
    var cal = Calendar.getInstance()
    fun setListener(listener: DatePickerDialog.OnDateSetListener?) {
        this.listener = listener
    }

    var btnConfirm: Button? = null
    var btnCancel: Button? = null
    @RequiresApi(Build.VERSION_CODES.N)
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder =
            AlertDialog.Builder(activity)
        val inflater = activity!!.layoutInflater
        val dialog: View = inflater.inflate(R.layout.year_month_picker, null).also {
            btnConfirm = it.findViewById<Button>(R.id.btn_confirm)
            btnCancel = it.findViewById<Button>(R.id.btn_cancel)
        }

        val monthPicker =
            dialog.findViewById<View>(R.id.picker_month) as NumberPicker
        val yearPicker =
            dialog.findViewById<View>(R.id.picker_year) as NumberPicker
        btnConfirm?.setOnClickListener(View.OnClickListener {

            if(tagname == "calendar") {
                val y = DateFragment.calDate.get(Calendar.YEAR)
                val m = DateFragment.calDate.get(Calendar.MONTH)
                DateFragment.calDate.add(
                    Calendar.MONTH,
                    12 * (yearPicker.value.toInt() - y) + (monthPicker.value.toInt()) - m
                )
                val month_left_button = v.findViewById<AppCompatImageButton>(R.id.cal_month_left)
                month_left_button?.performClick()
            }
            else if(tagname == "search")
            {
                v.searchview.setQuery("${yearPicker.value}" + " " + "${monthPicker.value}", true)
            }
            dismiss()

        })
        btnCancel?.setOnClickListener(View.OnClickListener {
            dismiss()
        })

        monthPicker.minValue = 1
        monthPicker.maxValue = 12
        monthPicker.value = cal[Calendar.MONTH] + 1
        val year = cal[Calendar.YEAR]
        yearPicker.minValue = MIN_YEAR
        yearPicker.maxValue = MAX_YEAR
        yearPicker.value = year
        builder.setView(dialog)

        return builder.create()
    }

}

다음과 같이 구성할 수 있다. 사실 버튼 클릭 리스너 부분은 참고하지 않아도 된다. 사용자 입맛에 맞게 설정할 수 있다.
버튼은 레이아웃에 정의하여 사용할 수도 있고, AlertDialog에서 제공하는 PositiveButton, NegativeButton를 사용할 수도 있다.


fun dialogCreate(view: View) {
        val pd: YearMonthPickerDialog<View> = YearMonthPickerDialog(view, "search")
        pd.show(supportFragmentManager, "YearMonthPickerTest")
    }

다이얼로그는 다음과 같이 생성되도록 해두었다.


결론

image

이렇게 커스텀으로 원하는 다이얼로그를 개발자가 직접 만들 수 있다.
처음엔 불편하다는 생각이 들지만 의외로 만들어보면 간단하고 커스터마이징 자유도도 높아서 좋다.


향후과제


참고자료

https://dreamaz.tistory.com/199


Writer: Jae-Hwan Lee

댓글남기기