안드로이드

[Android/Kotlin] 대화상자 Dialog (2) 미리 정의된 대화상자 : DatePickerDialog & TimePickerDialog - 1

란서 2022. 5. 31. 11:13

https://ranseo.tistory.com/296

 

[Android/Kotlin] 대화상자(Dialog) (1) AlertDialog

대화상자 Dialog 사용자에게 결정을 내리거나 추가 정보를 입력하라는 메세지를 표시하는 작은 창이다. (경우에 따라서 화면을 가득 채우기도 한다.) 사용자는 어떠한 뷰(버튼, 뷰 클릭)와 상호작

ranseo.tistory.com

 

 

DatePickerDialog & TimePickerDialog


 

미리 정의된 UI (라이브러리를 통해) 가 있는 대화상자이며, 사용자가 날짜 또는 시간을 선택할 수 있다.


DialogFragment 


class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {
	
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    	...
		return DatePickerDialog(...)
    }
    
    override fun onDateSet(p0:DatePicker?, p1: Int, p2:Int, p3:Int) {
    	...
    }	

}

DialogFragment를 상속받는 Fragment. 

onCreateDialog()메서드에서 DatePickerDialog 객체를 만들어 return 한다.

이 때 객체에 필요한 매개변수가 DatePickerDialog의 OnDateSetListener interface 이다.

따라서 해당 Fragment는DatePickerDialog.OnDateSetListener 구현하여 클래스 내에 onDateSet()메서드를 재정의.



만약 TimePickerDialog를 생성하고 싶다면,

class TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener {
	
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    	...
		return TimePickerDialog(...)
    }
    
    override fun onTimeSet(p0:DatePicker?, p1: Int, p2:Int, p3:Int) {
    	...
    }	

}

마찬가지로 TimePickerDialog의 interface를 구현한다.



 

Dialog 생성


 

1. DatePickerDialog

 

override 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)

        return DatePickerDialog(requireActivity(),this, year, month, day)
}

 

Calendar 객체를 통해  년, 월, 일 에 해당하는 값을 받아오고 DatePickerDialog() 에 인자로 넘겨준다. 

DatePickerDialog의 매개변수는 다양하지만 보통 

1.context // 2.OnDateSetListener // 3~5. Int (년,월,일) 

과 같은 형식이다.

 


 

2.TimePickerDialog

 

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val c = Calendar.getInstance()
        val hour = c.get(Calendar.HOUR_OF_DAY)
        val min = c.get(Calendar.MINUTE)

        return TimePickerDialog(requireContext(), this, hour, min, true)
    }

Calendar 객체를 통해 시간, 분 에 해당하는 값을 받아오고 TimePickerDialog()에 인자로 넘겨준다.

TimePickerDialog의 매개변수는 보통

1.context // 2.OnTimeSetListener // 3~4. Int (시간,분) // 5. Boolean (시간표시  12시간  - false, 24시간 - true)

 

 

외부와 연결할 Listener 설정


DatePickerDialog 또는 TimePickerDialog 는 각 onDateSet, onTimeSet 메서드를 이용해 사용자에 의해 선택된 날짜 및 시간을 받아올 수 있다.

이때 listener를 이용하여 해당 메서드 내에 넣어준다면 외부 코드와 쉽게 연결이 가능하다.


//리스너 설정

class DatePickerDialogFragment(_listener:OnDatePickerDialogListener) : DialogFragment(), DatePickerDialog.OnDateSetListener {
    private val listener = _listener

    interface OnDatePickerDialogListener {
        fun onDateSet(year:Int, month:Int, day:Int)
    }

    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)

        return DatePickerDialog(requireActivity(),this, year, month, day)
    }


    override fun onDateSet(p0: DatePicker?, p1: Int, p2: Int, p3: Int) {
        listener.onDateSet(p1,p2,p3)
    }
}

 

//외부 프래그먼트에서 사용

class SolaroidAddFragment : Fragment(), SaveDialogFragment.EditSaveDialogListener
,DatePickerDialogFragment.OnDatePickerDialogListener {
	
    ...
    
  
   fun showDatePickerDialog() {
        val newFragment = DatePickerDialogFragment(this)
        newFragment.show(parentFragmentManager, "DatePicker")
    }

    override fun onDateSet(year: Int, month: Int, day: Int) {
        viewModel.setDate(convertTodayToFormatted(convertDateToLong(year,month,day)))
    }
    
}