본문 바로가기
Andorid Kotlin

체크박스 리스너 등록

by SimonLee 2024. 10. 2.

체크 박스의 경우 그룹이 없기 때문에 리니어 레이아웃을 사용한다.

리니어 레이아웃이 상단이고,

하위에 Buttons->CheckBox를 3개를 넣자. 

 

리니어 레이아웃의 Constraint를 양방향으로 등록해주고,

리니어 레이아웃의 layout_width와 layout_height을 wrap_content로 설정하면 가운데 정렬이 된다.

 

레이아웃 오브젝트를 접근하기 위하여 뷰 바인딩을 사용한다.

(이전 챕터 참고)

check 박스 ID : checkApple, checkBanana, checkKiwi

 

첫번째 방법은 아래와 같이 checkApple 리스너를 등록한다.

with(binding) {
    checkApple.setOnCheckedChangeListener {button, isChecked ->
        if (isChecked) {
            Log.d(TAG, "apple selection")
        } else {
            Log.d(TAG, "apple is not selected")
        }
    }
}

 

코드를 간결하기 하게 하기 위해 리스너를 변수로 만들어서 아래처럼 작성한다.

interface를 구현하는 방법은

구현하고자 하는 인터페이스 앞에 object :  를 붙이고  중괄호를 넣는다. { }

중괄호 안에서 control  + 1을 누르면 오버라이딩된 함수 코드 정의부분이  생성된다.

val checkBoxListener2 = object : CompoundButton.OnCheckedChangeListener {
    override fun onCheckedChanged(checkBox: CompoundButton?, isChecked: Boolean) {
        when (checkBox?.id) {
            R.id.checkApple -> {
                Log.d(TAG, "apple ${isChecked}")
            }
            R.id.checkBanana -> {
                Log.d(TAG, "banana  ${isChecked}")
            }
            R.id.checkKiwi -> {
                Log.d(TAG, "kiwi  ${isChecked}")
            }
        }
    }
}

with (binding){
    checkApple.setOnCheckedChangeListener(checkBoxListener2)
    checkBanana.setOnCheckedChangeListener(checkBoxListener2)
    checkKiwi.setOnCheckedChangeListener(checkBoxListener2)
}

 

만일 인터페이스 내부에 구현해야 할 함수가 하나 밖에 없다면 오버라이딩 함수를 정의할 필요 없이

인터페이스 뒤에 바로 중괄호를 삽입한다.

 val checkBoxListener = CompoundButton.OnCheckedChangeListener { checkBox, isChecked ->
    when (checkBox.id) {
        R.id.checkApple -> {
            Log.d(TAG, "apple ${isChecked}")
        }
        R.id.checkBanana -> {
            Log.d(TAG, "banana  ${isChecked}")
        }
        R.id.checkKiwi -> {
            Log.d(TAG, "kiwi  ${isChecked}")
        }
    }
}