Dialog

유민국·2023년 6월 22일
0

Dialog

개발자가 필요할 때 사용자에게 메시지를 전달하는 용도로 사용하며 다이얼로그가 나타나 있을 때는 주변의 View를 사용할 수 없다.
메시지 전달이나 입력 등의 용도로 사용한다.

button

  • 기본적으로 dialog 버튼은 누르면 dialog는 사라진다.
  • 버튼의 위치에 따라 positive(맨 오른쪽), negative(positive 왼쪽), neutral(맨 왼쪽)
  • 버튼에 아무 기능이 없을 경우 listener(2번째 매개변수)에 null을 줄 수 있다.
  • 1번째 매개변수에는 버튼의 이름을 설정할 수 있다.
// builder.setPositiveButton("Positive",null)
// builder.setNegativeButton("Negative",null)
// builder.setNeutralButton("Neutral", null)

builder.setPositiveButton("Positive"){ dialogInterface: DialogInterface, i: Int ->
textView.text = "Positive 버튼을 눌렀습니다"
}
builder.setNegativeButton("Negative"){ dialogInterface: DialogInterface, i: Int ->
textView.text = "Negative 버튼을 눌렀습니다"
}
builder.setNeutralButton("Negative"){ dialogInterface: DialogInterface, i: Int ->
textView.text = "Neutral 버튼을 눌렀습니다"
}

Basic Dialog

기본 다이얼로그는 메시지와 최대 3개의 버튼을 제공할 수 있다.

// 다이얼로그 생성을 위한 객체를 생성한다.
val builder = AlertDialog.Builder(this@MainActivity)

// 타이틀
builder.setTitle("기본 다이얼로그")

// 메시지
builder.setMessage("기본 다이얼로그 입니다")

// 아이콘
builder.setIcon(R.mipmap.ic_launcher)

// 다이얼로그를 띄운다
builder.show()

custom Dialog

기본 다이얼로그에 View를 설정하면 다이얼로그에 표시되는 모양을 자유롭게 구성할 수 있다.

dialogBinding = DialogBinding.inflate(layoutInflater)
val builder = AlertDialog.Builder(this@MainActivity)
builder.setTitle("custom dialog")
builder.setIcon(R.mipmap.ic_launcher)

// 새로운 뷰를 설정한다.
builder.setView(dialogBinding.root)

dialogBinding.editTextDialog1.requestFocus()
thread {
    SystemClock.sleep(500)
    val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(dialogBinding.editTextDialog1, 0)
}
builder.setPositiveButton("확인", ){ dialogInterface: DialogInterface, i: Int ->
    // 입력한 내용을 가져온다.
    val str1 = dialogBinding.editTextDialog1.text.toString()
    val str2 = dialogBinding.editTextDialog2.text.toString()

    textView.text = "${str1}\n"
    textView.append("${str2}")
}

builder.setNegativeButton("취소",null)

builder.show()

DatePicker

다이얼로그를 통해 날짜를 선택할 수 있도록 제공되는 다이얼로그이다.

// 날짜를 선택하기 위해 사용하는 다이얼로그
val calendar = Calendar.getInstance()

val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)

// 날짜 선택하면 동작할 리스너
val datePickerListener =
    DatePickerDialog.OnDateSetListener { view, year, month, dayOfMonth -> textView.text = "${year}${month}${dayOfMonth}일" }


val pickerDialog = DatePickerDialog(this@MainActivity, datePickerListener,year,month,day)
pickerDialog.show()

TimePicker

다이얼로그를 통해 시간을 선택할 수 있도록 제공되는 다이얼로그이다.

val calendar = Calendar.getInstance()

val hour = calendar.get(Calendar.HOUR)
val minute = calendar.get(Calendar.MINUTE)

val timePickerListener =
    TimePickerDialog.OnTimeSetListener { view, hourOfDay, minute -> textView.text="${hourOfDay}${minute}분" }

val pickerDialog = TimePickerDialog(this@MainActivity, timePickerListener,hour,minute,true)
pickerDialog.show()

list dialog(단일 선택)

val adapter = ArrayAdapter<String>(this@MainActivity,
android.R.layout.simple_list_item_1, itemList)
val builder = AlertDialog.Builder(this@MainActivity)
builder.setTitle("리스트 다이얼로그")
builder.setIcon(R.mipmap.ic_launcher)

// 어뎁터를 설정한다.
// i : 사용자가 선택한 항목의 순서값이 들어온다.
builder.setAdapter(adapter){ dialogInterface: DialogInterface, i: Int ->
    textView.text = "선택한 항목 : ${itemList[i]}"
}

builder.setNegativeButton("취소", null)
builder.show()

list dialog(복수 선택)

val builder = AlertDialog.Builder(this@MainActivity)
builder.setTitle("다중 선택")
builder.setIcon(R.mipmap.ic_launcher)

// 체크 항목 초기화 배열
val boolArray = BooleanArray(itemList.size){
    false
}

boolArray[7] = true

builder.setMultiChoiceItems(itemList, boolArray, null)
builder.setNegativeButton("취소",null)
builder.setPositiveButton("확인",){ dialogInterface: DialogInterface, i: Int ->
    textView.text = ""

    // 다이얼로그에서 listView를 추출한다
    val alertDialog = dialogInterface as AlertDialog
    // 현재 체크되어 있는 상태 정보를 추출한다.
    // 처음에 체크 되어 있는 아이템과 후에 변경이 된 아이템이 담겨진다.
    // ex) {순서값 = 체크여부} 리스트
    val position = alertDialog.listView.checkedItemPositions
    for(idx in 0 until  position.size()){
        // 현재 항목의 위치값을 가져온다.
        val pos1 = position.keyAt(idx)
        // 현재 번째 배열에 값을 넣어준다.
        boolArray[pos1] = position.get(pos1)
    }

    for(idx in boolArray.indices){
        if(boolArray[idx]){
            textView.append("${itemList[idx]}\n")
        }
    }
}

builder.show()

누를 때 마다 배열 변경 할 경우

val builder = AlertDialog.Builder(this@MainActivity)
builder.setTitle("다중 선택 리스트 다이얼로그")

// 마지막 매개변수에 체크 상태가 변경되었을 때 동작하는 리스너를 설정해준다.
// 여기에서 체크 상태가 변경된 항목의 체크 상태 값을 BooleanArray에 담아 준다
// i : 체크 상태가 변경된 항목의 순서값
// b : 체크 상태
builder.setMultiChoiceItems(itemList, mutilChoiceList){ dialogInterface: DialogInterface, i: Int, b: Boolean ->
    mutilChoiceList[i] = b
}

builder.setNegativeButton("취소", null)
builder.setPositiveButton("확인", ){ dialogInterface: DialogInterface, i: Int ->
    textView.text = ""

    for(idx in mutilChoiceList.indices){
        if(mutilChoiceList[idx]){
            textView.append("${itemList[idx]}\n")
        }
    }
}

builder.show()
profile
안녕하세요 😊

0개의 댓글