안드로이드 다이얼로그의 기본은 알림 창으로 부르는 AlertDialog입니다. 알림 창은 간단한 메시지 뿐만 아니라 다양한 화면도 출력할 수 있습니다. 알림 창은 제목, 내용, 버튼 영역 크게 세 가지로 구분됩니다. 그런데 이 3가지 영역이 항상 보이는 것은 아닙니다. 알림 창 설정 시 제목과 버튼 정보를 지정하지 않았다면 내용 영역만 나오게 됩니다.
알림 창의 생성자는 접근 제한자가 protected로 선언되어 직접적인 객체 생성이 불가능합니다. 대신 AlertDialog.Builder를 제공하므로 이 빌더를 이용해 알림 창을 만듭니다. 먼저 AlertDialog.Builder를 생성하고 빌더의 세터 함수로 알림창의 정보를 지정합니다.
AlertDialog 생성하기
// AlertDialog 생성
AlertDialog.Builder(context: Context!)
다음은 알림 창에 아이콘에 제목, 내용을 지정하는 빌더의 세터 함수입니다.
// 제목 영역에 아이콘 출력
open fun setIcon(iconId: Int): AlertDialog.Builder!
// 제목 문자열 출력
open fun setTitle(title: CharSequence!): AlertDialog.Builder!
// 내용 영역에 간단한 문자열 출력
open fun setMessage(message: CharSequence!): AlertDialog.Builder!
다음은 알림 창에 버튼을 지정하는 함수입니다.
open fun setPositiveButton(text: CharSequence!, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!
open fun setNegativeButton(text: CharSequence!, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!
open fun setNeutralButton(text: CharSequence!, listener: DialogInterface.OnClicklistener!): AlertDialog.Builder!
각 함수의 첫 번째 매개변수는 버튼의 문자열, 두 번째 매개변수는 버튼을 클릭했을 때 처리할 이벤트 핸들러입니다. 만약 버튼을 클릭했을 때 처리할 내용이 없다면 두 번째 매개변수에 null을 대입합니다. null을 대입할 경우 버튼을 클릭하면 알림 창이 닫힙니다. 알림 창의 버튼은 최대 3개까지 추가 가능하며, 만약 같은 함수를 여러 번 사용하면 마지막 함수의 버튼으로 수행됩니다.
// 알림 창 띄우기
AlertDialog.Builder(this).run {
setTitle("test dialog")
setIcon(android.R.drawable.ic_dialog_info)
setMessage("test message")
setPositiveButton("YES", null)
setNegativeButton("NO", null)
setNeutralButton("MORE", null)
show()
}
버튼의 이벤트 핸들러 등록
// 버튼의 이벤트 핸들러 등록
val eventHandler = object: DialogInterface.OnClickListener {
override fun onClick(p0: DialogInterface?, p1: Int) {
if (p1 == DialogInterface.BUTTON_POSITIVE){
Log.d("ohsopp", "YES Button")
}
else if (p1 == DialogInterface.BUTTON_NEGATIVE) {
Log.d("ohsopp", "NO Button")
}
else if (p1 == DialogInterface.BUTTON_NEUTRAL) {
Log.d("ohspop", "MORE Button")
}
}
}
위의 이벤트 핸들러를 사용할 버튼의 세터 함수의 두 번째 매개변수에 넣어줍니다.
setPositiveButton("YES", eventHandler)
setNegativeButton("NO", eventHandler)
setNeutralButton("MORE", eventHandler)
목록을 출력하는 알림 창
알림 창의 내용 영역에는 간단한 문자열을 출력하는 setMessage() 말고도 다양한 함수가 있습니다. 만약 목록을 제공하고 이 중 하나를 선택받는 알림 창을 만들고자 한다면 setItems(), setMultiChoiceItems(), setSingleChoiceItems() 함수를 이용합니다. 함수에서 첫 번째 매개변수는 배열 정보이며 이 배열의 문자열이 목록에 출력됩니다.
주의할 점은 setMessage() 함수를 호출하는 경우 setMessage() 함수가 우선 순위를 가지게 됩니다.
// 1. 목록을 출력하는 알림 창 : setItems()
val items = arrayOf<String>("apple", "banana", "peach", "lemon", "orange")
AlertDialog.Builder(this).run {
setTitle("items test")
setIcon(android.R.drawable.ic_dialog_info)
setItems(items, object: DialogInterface.OnClickListener {
override fun onClick(p0: DialogInterface?, p1: Int) {
Log.d("ohsopp", "Selected fruit : ${items[p1]}")
}
})
setPositiveButton("OK", null)
show()
}
setItems() 함수의 두 번째 매개변수는 항목을 선택할 때의 이벤트 핸들러이며 사용자가 항목을 선택하면 onClick() 함수가 자동으로 호출됩니다. 선택한 항목의 인덱스는 onClick() 함수의 두 번째 매개변수 p1으로 전달됩니다. 또한 아래처럼 이벤트 핸들러를 변수로 선언할 수도 있습니다.
// 이벤트 핸들러를 변수로 선언
val itemEventHandler = object: DialogInterface.OnClickListener {
override fun onClick(p0: DialogInterface?, p1: Int) {
Log.d("ohsopp", "Selected fruit : ${items[p1]}")
}
}
setItems(items, itemEventHandler)
체크박스를 포함하는 목록을 출력하는 알림 창
setMultiChoiceItems() 함수는 다중 선택을 위한 체크박스가 함께 출력되는 항목을 만들어 줍니다.
두 번째 매개변수로 처음 체크 상태를 지정합니다.
// 2. 체크박스를 포함하는 목록 알림 창 : setMultiChoiceItems()
setMultiChoiceItems(items, booleanArrayOf(true, false, true, true, false), object: DialogInterface.OnMultiChoiceClickListener {
override fun onClick(p0: DialogInterface?, p1: Int, p2: Boolean) {
Log.d("ohsopp", "${items[p1]} is ${if(p2) "selected" else "released"}")
}
})
라디오 버튼을 포함하는 목록을 출력하는 알림 창
setSingleChoiceItems() 함수는 하나만 선택할 수 있는 라디오 버튼으로 구성된 항목을 만들어줍니다.
두 번째 매개변수로 처음 선택할 항목을 지정합니다.
// 3. 라디오 버튼을 포함하는 목록 알림 창 : setSingleChoiceItems()
setSingleChoiceItems(items, 2, object: DialogInterface.OnClickListener {
override fun onClick(p0: DialogInterface?, p1: Int) {
Log.d("ohsopp", "${items[p1]} is selected")
}
})
이외의 함수들
알림 창의 제목, 내용, 버튼을 구성하는 함수 외에 속성을 설정하는 함수를 사용할 수 있습니다.
open fun setCancelable(cancelable: Boolean): AlertDialog.Builder!
open fun setCanceledOnTouchOutside(cancel: Boolean): Unit
두 함수 모두 사용자의 행동에 따라 알림 창을 닫을지를 설정합니다. setCancelable() 함수는 사용자가 기기의 뒤로가기 버튼을 눌렀을 때, setCanceledOnTouchOutside() 함수는 알림 창의 바깥 영역을 터치했을 때 매개변수가 true이면 닫고 false이면 닫지 않습니다. 기본값은 true입니다.
AlertDialog.Builder(this).run {
//...(생략)...
setCancelable(false)
show()
}.setCanceledOnTouchOutside(false)
setCancelable() 함수는 AlertDialog.Builder 클래스의 함수이고, setCanceledOnTouchOutside() 함수는 Dialog 클래스의 함수입니다.
run()은 매개변수에 람다 함수를 지정할 수 있는 코틀린의 기초 함수입니다. run() 함수에 지정된 람다 함수는 run()을 호출한 객체의 멤버가 되어 람다 함수에서 this는 Builder 객체를 가리킵니다. 그리고 run() 함수의 반환값은 곧 람다 함수의 반환값입니다.
위 소스에서는 run() 함수에 지정한 람다 함수의 마지막 줄에 show() 함수를 호출했습니다.
안드로이드 공식 문서에서 볼 수 있듯이 show() 함수는 반환값이 AlertDialog 객체이며 이를 run() 함수가 반환하므로
AlertDialog.Builder(this).run { }.setCanceledOnTouchOutside(false) 처럼 작성이 가능합니다.
'📱 Android' 카테고리의 다른 글
[Android] ImageView(이미지뷰)를 보여주는 3가지 방법 (Kotlin) (0) | 2022.02.19 |
---|---|
[Android] Notification 객체로 상태바에 알림 띄우기 (Kotlin) (0) | 2022.02.12 |
[Android] 에뮬레이터 무한 로딩 오류 (0) | 2022.02.10 |
[Android] Custom Dialog 띄우기 (Kotlin) (0) | 2022.02.10 |