3 분 소요

다이얼로그란 사용자와 상호 작용하는 대화상자를 의미한다.

1. 토스트 (Toast)

토스트는 화면 아래 잠깐 보였다가 사라지는 문자열을 의미한다.
사용자에게 간단한 메시지로 특정한 상황을 알릴 때 사용

토스트는 Toast의 makeText() 함수로 만든다.

open static fun makeText(context: Context!, text: CharSequence!, duration: Int): Toast!

open static fun makeText(context: Context!, resId: Int, duration: Int): Toast!

makeText() 함수의 두번째 매개변수가 출력할 문자열, 세번째 매개변수는 토스트가 화면에 출력되는 시간으로,
보통 두가지의 상수를 사용함.

  1. val LENGTH_LONG: Int
  2. val LENGTH_SHORT: Int
val toast = Toast.makeText(this, "종료하려면 한 번 더 누르세요", Toast.LENGTH_SHORT)
toast.show()

makeText() 함수로 만든 토스트는 show()함수로 화면에 출력한다.
토스트는 아래의 세터 함수로도 생성이 가능함.

  1. open fun setDuration(duration: Int): Unit
  2. open fun setGravity(gravity: Int, xOffset: Int, yOffset: Int): Unit
  3. open fun setMargin(horizontalMargin: Float, verticalMargin: Float): Unit
  4. open fun setText(resId: Int): Unit

setDuration과 setText 함수를 이용해 문자열이나 화면에 보이는 시간을 설정하고,
setGravity나 setMargin 함수를 이용해 토스트가 뜨는 위치를 정할 수 있다.

토스트는 간단한 문자열을 화면에 출력하는게 목적이므로 show() 함수로 출력한 후 일정한 시간이 지났을 때 자동으로 사라지게 만들면 된다.
토스트가 화면에 보이거나 사라지는 순간을 콜백으로 감지해 특정 로직을 수행할 수도 있다.

@RequiresApi(Build.VERSION_CODES.R) // API 레벨 호환성 애너테이션
fun showToast() {
    val toast = Toast.makeText(this, "종료하려면 한 번 더 누르세요", Toast.LENGTH_SHORT)
    toast.addCallback(
        object : Toast.Callback() {
            override fun onToastHidden(){
                super.onToastHidden() //사라지는 순간
                Log.d("kkang", "toast hidden")
            }

            override fun onToastShown(){
                super.onToastShown() // 나타나는 순간
                Log.d("kkang", "toast shown")
            }
        }
    )
    toast.show()
}

토스트의 콜백을 등록하려면 Toast.Callback 타입의 객체를 토스트 객체의 addCallback() 함수로 등록해주면 된다.

2. 날짜 또는 시간 입력받기

날짜나 시간을 입력받는 데 사용하는 다이얼로그를 피커(Picker) 다이얼로그라고 한다.
날짜는 데이트 피커 다이얼로그, 시간은 타임 피커 다이얼로그를 사용한다.

 DatePickerDialog(context: Context, listener: DatePickerDialog.OnDateSetListener?, year:
 Int, month: Int, dayOfMonth: Int)

위는 데이트 피커 다이얼로그의 생성자이며 두번째 매개변수로 DatePickerDialog.OnDateSetListener 구현 객체를 등록하면 다이얼로그에서 사용자가 설정한 날짜를 콜백 함수로 얻을 수 있다.
나머지 Int 타입의 매개변수는 처음에 보이는 날짜이고 month의 경우 0 부터 11까지 지정되고 0은 1월을 의미한다.

DatePickerDialog(this, object: DatePickerDialog.OnDateSetListener {
    override fun onDateSet(p0: DatePicker?, p1: Int, p2: Int, p3: Int){
        Log.d("kkang", "year : $p1, month: ${p2+1}, dayOfMonth : $p3")
    }
}, 2020, 8, 21).show()

타임 피커 다이얼로그의 생성자는,

TimePickerDialog(context: Context!, listener: TimePickerDialog.OnTimeSetListener!,
hourOfDay: Int, minute: Int, is24HousView: Boolean)

두번째 매개변수로 TimePickerDialog.OnTimeSetListener를 구현한 객체를 지정하면 사용자가 다이얼로그에서 설정한 시간을 얻을 수 있고, 처음에 보일 시간을 Int 타입으로 설정할 수 있다.

마지막 매개변수로 시간을 24시간과 12시간 형태 중에 어떤 것으로 출력할 것인지를 지정한다.
false가 12시간, true가 24시간 형태이다.

TimePickerDialog(this, object: TimePickerDialog.OnTimeSetListener {
    override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {
        Log.d("kkang", "time : $p1, minute : $p2")
    }
}, 15, 0, true).show()

3. 알림창 띄우기

안드로이드 다이얼로그의 기본은 AlertDialog이다.
단순히 메시지만 출력할 수도 있고 다양한 화면을 출력할 수도 있다.
앞에서 나온 데이트 피커, 타임 피커도 AlertDialog의 하위 클래스이고 각각의 화면에 데이트 피커와 타임 피컬르 출력한 다이얼로그이다.

알림 창의 영역은 크게 제목, 내용, 버튼 3가지의 영역으로 구분된다.
이 3가지 영역이 항상 보이는건 아니고, 설정에 따라 다르게 나온다.
알림 창의 생성자는 접근 제한자가 protected로 선언돼서 객체를 직접 생성할 수는 없다.
그 대신 AlertDialog.Builder를 제공하므로 이 빌더를 이용해 만든다.

먼저 AlertDialog.Builder를 생성하고 빌더의 세터 함수로 알림 창의 정보를 지정한다.

AlertDialog.Builder(context: Context!)

아래는 알 창에 아이콘, 제목, 내용을 지정하는 함수이다.

  1. open fun setIcon(iconId: Int): AlertDialog.Builder!
  2. open fun setTitle(title: CharSequence!): AlertDialog.Builder!
  3. open fun setMessage(message: CharSequence!): AlertDialog.Builder!

setIcon() 함수는 제목 영역에 아이콘을 출력하고 setTitle() 함수는 제목 문자열을 출력한다.
내용 영역에 간단한 문자열을 출력할 때는 setMessage() 함수를 사용한다.

아래는 알림 창에 버튼을 지정하는 함수

  1. open fun setPositiveButton(text: CharSequence!, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!
  2. open fun setNegativeButton(text: CharSequence!, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!
  3. open fun setNeutralButton(text: CharSequence!, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!

각 함수의 첫 번째 매개변수는 버튼의 문자열이고 두 번째 매개변수는 사용자가 버튼을 클릭했을 때 처리할 이벤트 핸들러이다.
버튼 클릭시 처리할 내용이 없다면 두 번째 매개변수를 null로 지정한다.
알림 창의 버튼은 최대 3개까지 지정이 가능하다.

AlertDialog.Builder(this).run {
    setTitle("test dialog")
    setIcon(android.R.drawable.ic_dialog_info)
    setMessage("종료하시겠습니까?")
    setPositiveButton("OK", null)
    ...
    show()
}

버튼 함수를 세개로 구분하는 이유는 이벤트 핸들러에서 어떤 버튼이 클릭됐는지 구분하기 위해서이다.
각 이벤트에 해당하는 이벤트 핸들러를 따로 만들 수도 있지만, 한 알림 창의 버튼 이벤트를 하나의 이벤트 핸들러에서 모두 처리할 수도 있다.
이 때 어떤 버튼이 클릭되었는지를 구분해야 하는데, 셋 중 어떤 함수를 사용했는지에 따라 이벤트 핸들러에 전달되는 매개변숫값이 달라서 그 값으로 구분한다.

val eventHandler = object: DialogInterface.OnClickListener {
    override fun onClick(p0: DialogInterface?, p1: Int){
        if(p1 == DialogInterface.BUTTON_POSITIVE){
            Log.d("..", "positive")
        } else if (p1 == DialogInterface.BUTTON_NEGATIVE){
            ..
        }
    }
}
...
setPositiveButton("OK", eventHandler)
setNegativeButton("Cancel", eventHandler)

알림 창을 클릭했을 때 호출되는 onClick() 함수의 두 번째 매개변수가 이벤트가 발생한 버튼을 알려준다.

알림 창의 내용 영역에는 간단한 문자열을 출력하는 setMessage() 말고도 다양한 함수가 있다.
목록을 제공하고 이 중 하나를 선택받는 알림 창을 만들고자 한다면 setItems(), setMultiChoiceItems(), setSingleChoiceItems() 함수를 이용한다.
함수에서 첫 번째 매개변수는 배열 정보이고 이곳의 문자열이 목록에 출력된다.

  1. open fun setItems(items: Array<CharSequence!>!, listener: DialogInterface.onClickListener!): AlertDialog.Builder!
  2. open fun setMultiChoiceItems(items: Array<CharSequence!>!, checkedItems: BooleanArray!, listener: DialogInterface.OnMultiChoiceClickListener!): AlertDialog.Builder!
  3. open fun setSingleChoiceItems(items: Array<CharSequence!>!, checkedItems: Int, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!

태그:

카테고리:

업데이트:

댓글남기기