[안드로이드/메시징] Dialog

2023. 4. 10. 22:43· Android
목차
  1. Dialog
  2. DatePicker / TimePicker
  3. List Dialog
  4. 항목 선택 Dialog 
반응형

Dialog

  • 개발자가 필요시 사용자에게 메시지를 전달하는 용도로 사용 
  • 다이얼로그가 나타나 있을 땐 다른 주변 view 사용 못함 ex. 에러창
  • 메세지 전달이나 입력 등의 용도로 커스텀 가능
// 기본 다이얼로그 설정
binding.button.setOnClickListener {
    var dialog = AlertDialog.Builder(this)

    dialog.setTitle("기본 다이얼로그")
    dialog.setMessage("다이얼로그 메세지 입이다") // 표시할 메세지
    dialog.setIcon(R.mipmap.ic_launcher)

    // 버튼 셋팅 가능
    // 리스너를 넣어 버튼 클릭시 동작하도록 코딩 가능 (null 이면 그냥 사라짐)
    dialog.setPositiveButton("Positive"){ dialoginterface, i->
        // dialoginterface : 이 버튼을 가지고 있는 다이얼로그 객체
        // i : 버튼 구분자 이지만 여기선 각각 따로 세팅하므로 구분 필요 x
        binding.textView.text = "Positive 버튼을 누름"
    }
    dialog.setNeutralButton("Neutral", null)
    dialog.setNegativeButton("Negative"){dialoginterface, i->
        // dialoginterface : 이 버튼을 가지고 있는 다이얼로그 객체
        // i : 버튼 구분자 이지만 여기선 각각 따로 세팅하므로 구분 필요 x
        binding.textView.text = "Negative 버튼을 누름"
    }

    dialog.show()

}

// 커스텀 다이얼로그
binding.button2.setOnClickListener {
   // 커스텀 스낵바처럼 기본 다이얼로그에 뷰를 설정
    var dialog = AlertDialog.Builder(this)

    dialog.setTitle("커스텀 다이얼로그")
    dialog.setIcon(R.mipmap.ic_launcher)

    val custom_dialog_binding = CustomDialog2Binding.inflate((layoutInflater))
    val custom_view = custom_dialog_binding.root
    dialog.setView(custom_view)

    dialog.setPositiveButton("Positive"){ dialoginterface, i->
        // 코틀린은 closure 가 지원되는데 여기서 커스텀 뷰의 뷰를 가져다 사용할 수 있음
        binding.textView.text = "${custom_dialog_binding.customEdit1.text}"
        binding.textView.append("${custom_dialog_binding.customEdit2.text}")
    }
    dialog.setNegativeButton("취소", null)

    dialog.show()

}

 

DatePicker / TimePicker

  • 날짜/시간을 선택할 수 있는 다이얼로그
binding.button3.setOnClickListener {
    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 listener1 = DatePickerDialog.OnDateSetListener { datePicker, i, i2, i3 ->
        // datePicker : datePicker 객체
        // i : 선택한 년
        // i2 : 선택한 월
        // i3 : 선택한 일
        binding.textView.text = "${i}년 ${i2 + 1}월 ${i3}일" // 월이 0월 부터 시작하므로 +1 해줘야 한
    }

    val picker = DatePickerDialog(this, listener1, year, month, day) // 캘린더 객체를 다이얼로시간에 셋팅해 캘린더 다이얼로그를 만 + 1
    // 리스너에는 ok 버튼을 누르면 반응할 함수를 셋팅

    picker.show()

}

binding.button4.setOnClickListener {
    val calendar = Calendar.getInstance()

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


    val listener2 = TimePickerDialog.OnTimeSetListener { timePicker, i, i2 ->
        // timePicker : timePicker 객체
        // i : 선택한 시
        // i2 : 선택한 분
        binding.textView.text = "${i}시 ${i2}분"

    }

    val picker = TimePickerDialog(this, listener2, hour, minute, true) // true: 24시간제, false: 12시간제
    // 리스너에는 ok 버튼을 누르면 반응할 함수를 셋팅

    picker.show()

}

List Dialog

  • 다이얼로그에 ListView를 표시
  • 다이얼로그는 버튼을 총 3개까지 배치할 수 있는데 (pos,neg,neu) 그 이상이 필요한 경우 List Dialog 사용
// 기본 리스트 다이얼로그 (다이얼로그에 리트스뷰를 넣어 커스텀 한다고 생각하면 됨)
binding.button.setOnClickListener {
    var dialog = AlertDialog.Builder(this)

    dialog.setTitle("리스트 다이얼로그")
    dialog.setNegativeButton("취소",null)

    dialog.setItems(data1){dialoginterface, i->
        // i : 선택한 항목
        binding.textView.text = "${i}번째 항목 선택"
    }

    dialog.show()

}

// 커스텀 리스트 다이얼로그 (리스트뷰에 어댑터 설정하는 것과 동일)
binding.button2.setOnClickListener {
    val list1 = ArrayList<HashMap<String, Any?>>()
    for(idx in data2.indices) {
        val map = HashMap<String, Any?>()
        map["data2"] = data2[idx]
        map["data3"] = data3[idx]

        list1.add(map)
    }

    val keys = arrayOf("data2","data2")
    val ids = intArrayOf(R.id.custom_img, R.id.custom_text)

    val adapter = SimpleAdapter(this, list1,R.layout.custom_list,keys,ids)

    var dialog = AlertDialog.Builder(this)
    dialog.setTitle("커스텀 다이얼로그")
    dialog.setNegativeButton("취소", null)

    dialog.setAdapter(adapter){dialoginterface, i->
        binding.textView.text = "항목 ${data2[i]}"
    }
    dialog.show()

}

항목 선택 Dialog 

단일 선택 Dialog

  • 라디오 버튼 형태 
  • AlterDialogBuilder의 setSingleChoiceItems 메서드를 통해 구현 
  • AlertDialogBuilder (다이얼로그 객체)에서 listview를 추출하고 checkedItemPosition 프로퍼티를 이용해 현재 선택된 항목을 추출

다중 선택 Dialog

  • 체크박스 형태
  • AlterDialogBuilder의 setMultiChoiceItems 메서드를 통해 구현
  • AlertDialogBuilder (다이얼로그 객체)에서 listview를 추출하고 checkedItemPositions 프로퍼티를 이용해 현재 선택된 항목을 추출 -> 선택 상태가 변경된 항목의 인덱스가 추출 되므로 현재 선택이 되어 있는건지 아님 방금 취소한건지 확인 필요
// 기본 리스트 다이얼로그 (다이얼로그에 리트스뷰를 넣어 커스텀 한다고 생각하면 됨)
binding.button.setOnClickListener {
    var dialog = AlertDialog.Builder(this)

    dialog.setTitle("single choice 다이얼로그")

    dialog.setSingleChoiceItems(data1,3) {dialoginterface, i ->
        // 첫번째 매개변수 : 항목 데이터
        // 첫번째 매개변수 : 처음에 선택되어 있을 데이터 인덱스 번호
        // 첫번째 매개변수 : 리스너
        val t1 = Toast.makeText(this, data1[i],Toast.LENGTH_SHORT)
        t1.show()
    }

    dialog.setNegativeButton("취소",null)
    dialog.setPositiveButton("확인"){dialoginterface, i ->
        val alert = dialoginterface as AlertDialog //형변환
        val idx = alert.listView.checkedItemPosition //다이얼로그 객체에서 리스트뷰 추출, 선택한 항목 추출
        binding.textView.text = "선택된 항목 : ${data1[idx]} 선택"
    }

    dialog.show()
}

// 커스텀 리스트 다이얼로그 (리스트뷰에 어댑터 설정하는 것과 동일)
binding.button2.setOnClickListener {
    var dialog = AlertDialog.Builder(this)

    val boolArray = booleanArrayOf(true,false,false,true,false,false,false,false) // 처음 시작 체크 여부
    dialog.setMultiChoiceItems(data1, boolArray) {dialoginterface, i, b ->
        // i : 변경된 인덱스 정보 (한번에 하나만)
        // b : 변경된 인덱스의 체크 상태 (체크면 ture)
        if(b == true) {
            val t1 = Toast.makeText(this, "${data1[i]}가 체크됨", Toast.LENGTH_SHORT)
            t1.show()
        }
        else{
            val t1 = Toast.makeText(this, "${data1[i]}가 해제됨", Toast.LENGTH_SHORT)
            t1.show()
        }

    }
    dialog.setTitle("다중 선택 다이얼로그")
    dialog.setNegativeButton("취소", null)
    
    // 확인 버튼을 누르면 체크한 항목들을 텍스트뷰에 표시
    dialog.setPositiveButton("확인"){dialoginterface, i ->
        val alert = dialoginterface as AlertDialog //형변환

        binding.textView.text = ""
        val positions = alert.listView.checkedItemPositions // 체크상태 변경된 애들과 그 애들의 현재 체크 상태
        //Log.d("positions", "${positions}") // {항목 인덱스=bool} 형태

        for (i in 0 until positions.size()) {
            var index = positions.keyAt(i) // key깂(항목 index)을 뽑아냄

            if(positions.get(index) == true) {
                binding.textView.append(data1[index])
            }
        }
    }

    dialog.show()

}

 

💡Closure 란 무엇일까? 람다함수의 끝은 어디인가?...

반응형

'Android' 카테고리의 다른 글

[안드로이드/메시징] Pending Intent  (0) 2023.04.13
[안드로이드/메시징] Notification  (0) 2023.04.11
[안드로이드/메시징] SnackBar  (0) 2023.04.04
[안드로이드/메시징] Toast  (0) 2023.03.31
[안드로이드/Activity] Activity Action  (0) 2023.03.31
  1. Dialog
  2. DatePicker / TimePicker
  3. List Dialog
  4. 항목 선택 Dialog 
'Android' 카테고리의 다른 글
  • [안드로이드/메시징] Pending Intent
  • [안드로이드/메시징] Notification
  • [안드로이드/메시징] SnackBar
  • [안드로이드/메시징] Toast
gangmini
gangmini
gangmini
게으른J 의 테크로그
gangmini
전체
오늘
어제
글쓰기방명록관리자
  • 분류 전체보기 (127)
    • 인공지능(AI) & 데이터 분석 (5)
    • Android (91)
      • Coroutine (3)
      • Compose (0)
      • 안드로이드 CS (0)
    • Kotlin (3)
    • Data Structure (0)
    • 알고리즘 (20)
      • 알고리즘 이론 (11)
      • 백준(BOJ) 문제 풀이 (9)
    • Build Tool (2)
    • Git (2)
    • 일본어 (0)
    • 기타(취준, 활동) (0)


인기 글



최근 댓글



최근 글

hELLO · Designed By 정상우.v4.2.2
gangmini
[안드로이드/메시징] Dialog
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.