10-3 다양한 다이얼로그

StrayCat·2022년 11월 9일
0

다이얼로그

  • 사용자와 상호 작용하는 대화상자
  • 토스트, 날짜 또는 시간 입력, 알림 창 등 포함
  • 커스텀 다이얼로그 생성 가능

토스트 메세지

  • 화면 아래쪽에 잠깐 보였다가 사라지는 문자열
  • 간단한 정보를 사용자에게 보여줄 수 있다.
val toast = Toast.makeText(this, "Long Toast", Toast.LENGTH_LONG)
toast.show()
  • 뜨는 시간 조절은 Toast.LENGTH_LONG, Toast.LENTH_SHORT 로 설정한다.

  • setDuration(), setGravity(), setMargin() 함수를 통해 위치를 변경할 수 있다.

  • API 레벨 30 부터는 토스트 메세지가 뜨거나 사라지는 순간에 콜백함수가 실행되는 기능이 추가되었다. ( 어노테이션 @RequiresApi(Build.VERSION_CODES.R) 추가 필요 )

toast.addCallback(
    object : Toast.Callback(){
        override fun onToastHidden() {
            super.onToastHidden()
        }
        override fun onToastShown() {
            super.onToastShown()
        }
    }
)

피커 다이얼로그

  • 사용자에게 날짜나 시간을 입력받는 데 사용하는 다이얼로그
  • 데이트 피커 다이얼로그(날짜), 타임 피커 다이얼로그(시간)

데이트 피커 다이얼로그

val datePickerDialog = DatePickerDialog(this, object: DatePickerDialog.OnDateSetListener{
    override fun onDateSet(p0: DatePicker?, p1: Int, p2: Int, p3: Int) {
        Log.d("lumineko", "${p1}.${p2+1}.${p3}")
    }
}, 2022,11,9) // 초기값 2022년 12월 9일

datePickerDialog.show()
  • onDateSet을 override하여 설정한 날짜를 콜백 함수로 얻을 수 있다.
  • '월'의 경우 0~11 까지 있으며 각 1~12월에 대응된다.

타임 피커 다이얼로그

val timePickerDialog = TimePickerDialog(this, object: TimePickerDialog.OnTimeSetListener{
    override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {
        Log.d("lumineko", "${p1}:${p2}")
    }
}, 15, 0 , true)//24시 표시 여부

timePickerDialog.show()

알림창 띄우기

  • AlertDialog 를 통해 알림창을 띄울 수 있다.
  • 알림창은 크게 제목 / 내용 / 버튼 3부분으로 구성되어 있다.
  • 알림창 생성자는 protected로 되어있어 객체를 직접 생성할 수 없다. 대신 AlertDialog.Builder를 통해 알림창을 생성한다.
AlertDialog.Builder(this).run {
    setTitle("Title")
    setIcon(android.R.drawable.ic_dialog_info)
    setMessage("Message")

    setPositiveButton("OK", eventHandler)
    setNegativeButton("Cancel", eventHandler)
    setNeutralButton("Other", null)
    show()
}
  • 버튼은 Positive, Negative, Neutral 3개만 설정할 수 있다.
  • 버튼을 클릭했을 때 실행할 이벤트 핸들러는 2번째 매개변수에 대입한다.(없으면 null)
val eventHandler = object : DialogInterface.OnClickListener{
    override fun onClick(p0: DialogInterface?, p1: Int) {
        when(p1){
            DialogInterface.BUTTON_POSITIVE -> Log.d("lumineko", "positive")
            DialogInterface.BUTTON_NEGATIVE -> Log.d("lumineko", "negative")
        }
    }
}

선택지 알림창

  • setMessage 대신 setItems, setMultiChoiceItems, setSingleChoiceItems 를 사용하여 목록을 보여줄 수도 있다.

  • setItems

val items = arrayOf<String>("배그", "발로", "옵치", "에펙")

AlertDialog.Builder(this).run {
    setTitle("Title")
    setIcon(android.R.drawable.ic_dialog_info)

    setItems(items, object: DialogInterface.OnClickListener{
        override fun onClick(p0: DialogInterface?, p1: Int) {
            Log.d("lumineko", "${items[p1]}")
        }
    })

    setPositiveButton("OK", eventHandler)
    setNegativeButton("Cancel", eventHandler)
    setNeutralButton("Other", eventHandler)
    show()
}

(결과)

  • setMultiChoiceItems ( 다중 선택 체크박스 )
setMultiChoiceItems(items, booleanArrayOf(true,false,false,true), object: DialogInterface.OnMultiChoiceClickListener{
    override fun onClick(p0: DialogInterface?, p1: Int, p2: Boolean) {
        Log.d("lumineko", "${items[p1]}, $p2")
    }
})
  • setSingleChoiceItems ( 단일 선택 라디오버튼 )
setSingleChoiceItems(items, 1, object: DialogInterface.OnClickListener{
                    override fun onClick(p0: DialogInterface?, p1: Int) {
                        Log.d("lumineko", "${items[p1]}")
                    }
                })

닫기 동작 버튼

  • setCancelable, setCanceledOnTouchOutside
AlertDialog.Builder(this).run {
	...
    setCancelable(false) //true일때, 뒤로가기 버튼으로 선택창 닫기
	...
}.setCanceledOnTouchOutside(false) //true일때, 화면 밖을 클릭해서 선택창 닫기

커스텀 다이얼로그

  • 개발자가 원하는 형태로 구성한 다이얼로그

LayoutInflater

  • 레이아웃 XML파일을 코드에서 초기화 하는 기능을 제공한다.

  • 이때 초기화란, XML 파일에 선언한 뷰를 코드에서 이용하고자 생성하는 작업을 의미한다.

  • XML에 선언한 객체를 생성해서 메모리에 할당한다.

  • 액티비티 화면을 구성하는 레이아웃 XML 파일이면 setContentView() 를 사용하는 반면, 화면을 목적으로 하지 않는 레이아웃 XML 파일에는 LayoutInflater를 사용한다.

  • 뷰바인딩을 사용하지 않는 초기화

val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val rootView = inflater.inflate(R.layout.activity_main, null)
  • 뷰바인딩을 사용한 초기화
val binding = ActivityMainBinding.inflate(layoutInflater)
val rootView = binding.root
  • 원하는 XML 레이아웃을 적용한 커스텀 다이얼로그
val dialogBinding = DialogInputBinding.inflate(layoutInflater) // dialog_input.xml 적용
AlertDialog.Builder(this).run {
    setTitle("Title")
    setView(dialogBinding.root)
    show()
}

0개의 댓글