안드로이드 다이얼로그의 기본은 알림 창으로 부르는 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) 처럼 작성이 가능합니다.

 

 

+ Recent posts