Skip to content

날짜 선택 Bottom Sheet

Jo Hyun Jin edited this page Jan 15, 2021 · 2 revisions

날짜 선택 Bottom Sheet

image

  • NumberPicker 3개를 년, 월, 일로 지정하여 custom 해서 사용

  • 기본 세팅

      // 현재 날짜 가져오기
       val currentDate = Calendar.getInstance()
      
       // minValue = 최소 날짜 표시
       year.minValue = 2020
       month.minValue = 1
       date.minValue = 1
      
       // maxValue = 최대 날짜 표시
       year.maxValue = currentDate.get(Calendar.YEAR)
      
       // year에 따라 month maxValue 변경
       if(diary_year == currentDate.get(Calendar.YEAR)) {
           month.maxValue = currentDate.get(Calendar.MONTH) + 1
       } else {
           month.maxValue = 12
       }
      
       // month에 따라 month, date maxValue 변경
       if(diary_month == currentDate.get(Calendar.MONTH) + 1) {
           month.maxValue = currentDate.get(Calendar.MONTH) + 1
           date.maxValue = currentDate.get(Calendar.DAY_OF_MONTH)
       } else {
           setMonthMax()
       }
      
      // 해당 다이어리의 날짜를 picker 가운데에 세팅
       year.value = diary_year
       month.value = diary_month
       date.value = diary_date
      
       // 순환 안되게 막기
      year.wrapSelectorWheel = false
       month.wrapSelectorWheel = false
       date.wrapSelectorWheel = false
      
       // edittext 입력 방지
       year.descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS
       month.descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS
       date.descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS
      
  • picker value change listener
    => 년도가 올해이면, 월과 일의 maxValue가 '오늘'로 설정되어야함
    => 년도가 올해가 아니면, 월과 일의 maxValue가 12월 31일로 설정되어야함

  • 스크롤했을 때 해당 날짜에 일기가 있는지 체크
    => 해당 날짜에 일기가 있으면 버튼 비활성화, 일기가 없으면 버튼 활성화

      // year picker change listener
      year.setOnValueChangedListener { _, _, _ ->
      
          if(year.value == currentDate.get(Calendar.YEAR)) {
              month.maxValue = currentDate.get(Calendar.MONTH) + 1
              date.maxValue = currentDate.get(Calendar.DAY_OF_MONTH)
          } else {
              month.value = currentDate.get(Calendar.MONTH) + 1
              date.value = currentDate.get(Calendar.DAY_OF_MONTH)
              month.maxValue = 12
              setMonthMax()
          }
      
      }
      
      // month picker change listener
      month.setOnValueChangedListener { _, _, _ ->
      
          if(year.value == currentDate.get(Calendar.YEAR) && month.value == currentDate.get(
                          Calendar.MONTH) + 1) {
              // 현재 년도에 현재 날짜일 때
              month.maxValue = currentDate.get(Calendar.MONTH) + 1
              date.maxValue = currentDate.get(Calendar.DAY_OF_MONTH)
          } else {
              month.maxValue = 12
              setMonthMax()
          }
      
      }
      
      // 스크롤 했을 때 해당 날짜에 일기가 있는지 체크
      year.setOnScrollListener(pickerScrollListener)
      month.setOnScrollListener(pickerScrollListener)
      date.setOnScrollListener(pickerScrollListener)
      
      Binding.btnDiaryDateEdit.setOnClickListener {
          val pick = intArrayOf(year.value, month.value, date.value)
          itemClick(pick)
      
          // 날짜수정 통신
          requestEditDiary()
      }
      
      Binding.btnCloseDiaryEditDate.setOnClickListener {
          dialog?.dismiss()
      }