Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준
- CoordinatorLayout
- 코틀린
- onMeasure
- kotlin
- hilt
- View
- recyclerview
- 알고리즘
- HTTP
- BOJ
- activity
- LiveData
- AppBarLayout
- Navigation
- onLayout
- 안드로이드
- lifecycle
- Behavior
- DataBinding
- sqlite
- room
- Android
- Coroutine
- ViewModel
- CollapsingToolbarLayout
- Algorithm
- 알림
- notification
- CustomView
Archives
- Today
- Total
개발일지
Android in A..Z - Dialog 본문
Dialog
Activity나 Fragment과 다른 작은 화면의 창입니다. 특정 작업전에 입력을 받거나 알람용도로 쓰입니다.
DatePickerDialog
달력에서 날짜를 선택하여 Listener를 통해 값을 받을 수 있다.
private fun initOnDatePicker() {
binding.setOnDatePicker {
val calendar = GregorianCalendar()
DatePickerDialog(requireContext(), { dialog, year, month, dayOfMonth ->
binding.result = """
Dialog : ${dialog.id}
Event : ${SimpleDateFormat.getDateInstance().format(GregorianCalendar(year, month, dayOfMonth).timeInMillis)}
""".trimIndent()
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show()
}
}
TimePickerDialog
시계에서 시간을 선택하여 Listener를 통해 값을 받을 수 있다.
마지막 매개변수의 Boolean은 true일 때 시계로 0 ~ 24 시간을 선택할 수 있고, false일 때 AM/PM 을 설정할 수 있다.
private fun initOnTimePicker() {
val calendar = GregorianCalendar()
binding.setOnTimePicker {
TimePickerDialog(requireContext(), { dialog, hourOfDay, minute ->
binding.result = """
Dialog : ${dialog.id}
Event : ${SimpleDateFormat.getTimeInstance().format(GregorianCalendar().apply {
set(Calendar.HOUR_OF_DAY, hourOfDay)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, 0)
}.timeInMillis)}
""".trimIndent()
}, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), false).show()
}
}
AlertDialog
알람창 형식으로 사용자에게 Message를 전달할 때 사용한다.
- setIcon : Icon 지정가능
- setTitle : Title 지정가능
- setPositiveButton : Positive Button 설정가능 (매개변수로 표시할 Text와 Callback을 전달한다.)
- setNegativeButton : Negative Button 설정가능 (매개변수로 표시할 Text와 Callback을 전달한다.)
- setNeutralButton : Neutral Button 설정가능 (매개변수로 표시할 Text와 Callback을 전달한다.)
private fun initOnAlert() {
binding.setOnAlert {
AlertDialog.Builder(requireContext()).apply {
setIcon(R.drawable.ic_info)
setTitle("This is Title")
setMessage("This is Message")
setPositiveButton("Positive") { _, which ->
binding.result = "Positive $which"
}
setNegativeButton("Negative") { _, which ->
binding.result = "Negative $which"
}
setNeutralButton("Neutral") { _, which ->
binding.result = "Neutral $which"
}
}.show()
}
}
SelectAlertDialog
하나의 아이템을 고르는 Dialog입니다.
AlertDialog의 setItems를 사용하여 만들 수 있습니다. (매개변수로 Item배열과 Listener로 Callback을 전달한다.)
private fun initOnSelectAlert() {
binding.setOnSelectAlert {
AlertDialog.Builder(requireContext()).apply {
setTitle("Select Item")
setItems(items) { _, position ->
selectedBooleanArray[position] = true
binding.result = "Select ${items[position]}"
}
}.show()
}
}
RadioAlertDialog
RadioButton을 이용해 하나의 Item을 선택하는 Dialog입니다.
AlertDialog의 setSigleChoiceItems를 사용하여 만들 수 있습니다. (선택 값을 -1로 주면 선택하지 않은 상태에서 시작)
private fun initOnRadioAlert() {
binding.setOnRadioAlert {
AlertDialog.Builder(requireContext()).apply {
setTitle("Radio Alert")
var selected = selectedBooleanArray.indexOfFirst { it }
setSingleChoiceItems(items, selected) { _, position ->
selected = position
Toast.makeText(requireContext(), items[position], Toast.LENGTH_SHORT).show()
}
setPositiveButton("Select") { _, _ ->
selectedBooleanArray.fill(false)
selectedBooleanArray[selected] = true
binding.result = "Select ${items[selected]}"
}
}.show()
}
}
CheckBoxAlertDialog
CheckBox를 통해 여러개의 Item을 선택하는 Dialog입니다.
AlertDialog의 setMultiChoiceItems를 사용하여 만들 수 있습니다.
private fun initOnCheckboxAlert() {
binding.setOnCheckBoxAlert {
AlertDialog.Builder(requireContext()).apply {
setTitle("Checkbox Alert")
val selected = BooleanArray(items.size) { selectedBooleanArray[it] }
setMultiChoiceItems(items, selected) { _, position, boolean ->
selected[position] = boolean
Toast.makeText(requireContext(), "${items[position]} $boolean", Toast.LENGTH_SHORT).show()
}
setPositiveButton("Select") { _, _ ->
selected.forEachIndexed { position, boolean ->
selectedBooleanArray[position] = boolean
}
binding.result = "Select\n"
selected.forEachIndexed { index, boolean ->
if (boolean) {
binding.result += "${items[index]}\n"
}
}
}
}.show()
}
}
CustomAlertDialog
AlertDialog의 setView를 사용하여 사용자가 직접 AlertDialog의 형태를 설정할 수 있습니다.
private fun initOnCustomAlert() {
binding.setOnCustomAlert {
AlertDialog.Builder(requireContext()).apply {
setTitle("Custom Alert")
setView(LayoutCustomAlertBinding.inflate(LayoutInflater.from(context)).root)
}.show()
}
}
CustomDialog
DialogFragment를 상속받아서 직접 Dialog를 만들 수 있다.
Dialog대신 DialogFragment를 상속받았을 때 이점
- 수명 주기에 대해 효과적으로 대응할 수 있다.
- Fragment처럼 한 화면에 여러 화면을 구성할 때 재사용할 수 있다.
- Jetpack Navigation을 활용하여 값 전달, 호출 등 Dialog에 쉽게 접근할 수 있다.
private fun initOnCustomDialog() {
binding.setOnCustomDialog {
// findNavController().navigate(MainFragmentDirections.actionMainFragmentToCustomDialog())
CustomDialog().show(parentFragmentManager, "")
}
}
Git (예제코드)
github.com/KangTaeJong98/Example/tree/main/Android/Dialog
'Android (안드로이드)' 카테고리의 다른 글
Android in A..Z - ActivityResultContract (0) | 2021.05.23 |
---|---|
Android in A..Z - DataStore (0) | 2021.03.30 |
Android in A..Z - QR Code (0) | 2021.03.16 |
Android in A..Z - Location (0) | 2021.02.06 |
Android in A..Z - Fragment.setRetainInstance (0) | 2021.02.01 |
Comments