개발일지

Android in A..Z - Dialog 본문

Android (안드로이드)

Android in A..Z - Dialog

강태종 2021. 3. 22. 02:17

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

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com

 

'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