[kotlin] 안드로이드 다이얼로그 목록 출력

Leechaeyeon·2023년 7월 1일
0

코틀린 안드로이드

목록 보기
7/21
post-thumbnail

목록 출력 다이얼로그

단일 선택 다이얼로그

AlterDialog.Builder 사용방식

  • setItems 메서드를 통해 다이얼로그 항목들을 설정하고, 클릭이벤트를 처리할 수 있다.
  • 항목을 클릭하면 해당 항목의 인덱스를 얻을 수 있으며, 이를 통해 선택한 항목을 처리할 수 있다.
  • 간단하고 직관적인 방식으로 구현할 수 있으며, 리스트의 항목이 비교적 적을 때 유용하다.
fun listDialog(){
        val dataList = arrayOf(
            "항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
            "항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
            "항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
        )

        val adapter = ArrayAdapter<String>(
            this@MainActivity, android.R.layout.simple_spinner_item,dataList
        )
        val builder = AlertDialog.Builder(this@MainActivity)
        builder.setTitle("리스트 다이얼로그")
        // builder에 어뎁터 설정
        // 두 번째 매개변수에는 사용자가 선택한 항목의 순서값이 들어온다.
        builder.setAdapter(adapter){ dialogInterface: DialogInterface, i: Int ->
            setTextView.text = "선택한 항목 : ${dataList[i]}"
        }
        builder.setNegativeButton("취소",null)
        builder.show()
    }

ArrayAdapter 사용한 방식

  • 스피너 또는 리스트뷰와 같은 AdapterView에 데이터를 표시하는데 특화된 어댑터 클래스
  • 데이터와 아이템 레이아웃을 따로 분리하여 처리할 수 있으며, 커스텀화가 용의
  • 데이터 집합이 많거나 동적으로 변경될 경우 유용

두 방식은 사용 목적과 상황에 따라 선택 가능

  • 단순 리스트를 보여주기 : 항목을 선택하는 기능이라면 AlterDialog.Builder를 사용하는 것이 간단하고 효과적
  • 데이터 집합이 많거나 커스텀한 디자인이 필요한 경우 ArrayAdapter를 사용하여 데이터를 표시하는 것이 더 적절

ArrayAdapter

배열 또는 리스트와 같은 데이터 집합을 사용하여 스피너 또는 리스트뷰와 같은 AdapterView에 데이터를 표시하는데 사용하는 어뎁터 클래스

  • context : 어뎁터를 사용하는 컨텍스트 ( this@MainActivity )
  • resource: 아이템의 레이아웃 리소스 ID또는 시스템 제공 레이아웃 리소스 ( 예 : android.R.layout.simple_spinner_item
  • object : 데이터 집합

=> ArrayAdapter를 사용하여 데이터를 스피너에 표시하면, 데이터 집합의 각 항목이 스피터너의 아이템으로 표시되며, 사용자는 이를 선택할 수 있다.

fun listDialog2(){
        val dataList = arrayOf(
            "항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
            "항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
            "항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
        )
        AlertDialog.Builder(this).run{
            setTitle("리스트 다이얼로그2")
            setItems(dataList,object:DialogInterface.OnClickListener{
                override fun onClick(dialog: DialogInterface?, which: Int) {
                    setTextView.text = "선택한 항목 : "
                    setTextView.append("${dataList[which]}")
                }

            })
            setNegativeButton("닫기",null)
            show()
        }
    }

다중선택 다이얼로그

fun multiChooseDialog(){
        val dataList = arrayOf(
            "항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
            "항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
            "항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
        )
        val builder = AlertDialog.Builder(this@MainActivity)
        builder.setTitle("다중 선택 리스트 다이얼로그")
        val boolArray = BooleanArray(dataList.size){i->false}
        // 1,3,5값에 true를 넣어주면 선택된 상태로 나옴
        boolArray[0] = true
        boolArray[2] = true
        boolArray[4] = true

        builder.setMultiChoiceItems(dataList,boolArray,null)
        builder.setNegativeButton("취소",null)
        builder.setPositiveButton("확인"){ dialogInterface: DialogInterface, i: Int ->
            setTextView.text = ""
            // 다이얼로그에서 ListView를 추출
            val alertDialog = dialogInterface as AlertDialog
            // 현재 선택되어 있는 상태 정보를 추출
            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 0 until boolArray.size){
                if(boolArray[idx] == true){
                    setTextView.append("${dataList[idx]}\n")
                }
            }
            setTextView.text = "${position}"
        }
        builder.show()
    }

다른 코드로 작성

fun multiChooseDialog2() {
        val dataList = arrayOf(
            "항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
            "항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
            "항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
        )
        val boolArray = booleanArrayOf(false, false, false, false, false, false,
            false, false, false, false, false, false,
            false, false, false, false, false, false)

        boolArray[0] = true
        boolArray[2] = true
        boolArray[4] = true

        AlertDialog.Builder(this@MainActivity).run {
            setTitle("다중선택 다이얼로그")
            setMultiChoiceItems(dataList, boolArray) { dialogInterface, which, isChecked -> }
            setNegativeButton("취소", null)
            setPositiveButton("확인") { dialogInterface: DialogInterface, i: Int ->
                setTextView.text = ""
                for (idx in dataList.indices) {
                    if (boolArray[idx]) {
                        setTextView.append("${dataList[idx]}\n")
                    }
                }
            }
            show()
        }
    }
  • setMultiChoiceItems() 함수의 세 번째 매겨분수가 항목을 선택할 때의 이벤트 핸들러이며, 사용자가 항목을 선택하는 순간 onClick()함수가 자동으로 호출된다.

라디오 선택 다이얼로그

fun radioDialog() {
        val dataList = arrayOf(
            "항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
            "항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
            "항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
        )

        var checkedItem = 1

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

        builder.setNegativeButton("취소", null)
        builder.setPositiveButton("확인") { dialogInterface: DialogInterface, i: Int ->
            setTextView.text = "${dataList[checkedItem]}가 선택되었습니다."
        }

        builder.setSingleChoiceItems(dataList, checkedItem) { dialogInterface: DialogInterface, position: Int ->
            checkedItem = position
        }

        builder.show()
    }

알림창 닫기 설정

open fun setCancelable(cancelable:Boolean):AlertDialogBuilder!
open fun setCanceledTouchOutside(cancel:Boolean):Unit 
  • 뒤로가기 버튼 클릭시 닫기 -> setCancelable(true) // 기본값
  • 알림창 바깥 영역 터치시 닫기 -> setCancledTouchOutside(true) // 기본값

0개의 댓글

관련 채용 정보