Fragment에서 ViewBinding을 활용한 상태에서
여러개의 버튼이나 TextView에 반복되는 값을 부여하는 경우가 있었다.
물론, viewbinding말고 다른 방법이나 더 현명한 방법이 있을 듯 하다.
현재까지 내가 찾고 도움을 받은 코드를 적어보겠다.
일단, 상황은 버튼을 클릭한 경우 같은 layout 안에 있는 다른 버튼들의 ui가 음영처리가 되게 하고 싶었다.
viewbinding을 통해 버튼을 불러오고, 해당 색상을 kotlin 코드로 변경해주는 것은 알았지만,
onclick이벤트가 발생했을 때 다른 버튼이 자동으로 음영처리되게 하는 직관적인 방법이 필요했다.
이전에는 일일히 if문을 통해 다른 버튼의 색상을 바꿔주는 함수를 만들어서 사용했었다.
이번에는 이러한 기능을 좀 더 짧고 간편하게 사용하기위해 stackoverflow에 질문을 하여 짧은 코드로 변경했다.
처음의 코드는 아래와 같았다.
fun select(btn: Button){
btn.setOnClickListener {
Pear2.instance.showToast("선택 : ${btn.text}")
Log.d(Pear2.IK, "선택 : ${btn.text}")
val kind = listOf("1","2","3","4","5","6")
for(i in kind) {
if (i != btn.tag){
viewBinding.kindGrid.findViewWithTag<View>(i).backgroundTintList =
ContextCompat.getColorStateList(it.context, R.color.pear_btn_color_off)
}else{
viewBinding.kindGrid.findViewWithTag<View>(i).backgroundTintList =
ContextCompat.getColorStateList(it.context, R.color.pear_btn_color)
}
}
}
buttons.forEach { button -> val colors = if (button == btn) R.color.pear_btn_color else R.color.pear_btn_color_off
ContextCompat.getColorStateList(btn.context, colors)
}
}
이렇게 하면 select()라는 함수를 각 버튼마다 다~~ 적용해줘야 했다.
이런 방법말고 한번에 할 수 없을까 했다. - 고민을 해도 머리가 잘안 돌아가서 stack에 물어봤더니
아래와 같은 코드를 추천해주었다.
lateinit val buttons: List<Button>
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val tags = listOf("1","2","3","4","5","6")
// look up all your buttons, creating a list of Button views
buttons = tags.map { tag ->
viewBinding.kindGrid.findViewWithTag<Button>(tag)
}
// now you can just apply a click listener to each of them
buttons.forEach {
setOnClickListener { view -> select(view as Button) }
}
}
fun select(selected: Button){
buttons.forEach { button ->
// you could check the tags, but since we have a list of all the actual
// buttons, we can just check which of them has been passed in
val colour = if (button == selected) R.color.btn_color else R.color.btn_color_off
button.backgroundTintList = ContextCompat.getColorStateList(it.context, colour)
}
}
위의 코드를 참조하여, 테스트하고, 다시 잘 적용이 되도록 변경했다.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val tags = resources.getStringArray(R.array.button_tags)
buttonsKind = tags.map { tag -> viewBinding.kindGrid.findViewWithTag(tag) }
buttonsNum = tags.map{ tag -> viewBinding.numberGrid.findViewWithTag(tag)}
var kind = ""
var num = ""
buttonsKind.forEach{ it.setOnClickListener { view -> selectKind(view as Button)
kind = view.text.toString()
Log.d(Pear2.IK, "선택된 종류: $kind")}}
...
}
// 선택된 버튼과 미선택 버튼의 색상을 바꿔주는 함수
private fun selectKind(selected: Button){
Log.d(Pear2.IK, "선택버튼: ${selected.text}")
buttonsKind.forEach{ button ->
val colors = if(button == selected) R.color.pear_btn_color else R.color.pear_btn_color_off
button.backgroundTintList = ContextCompat.getColorStateList(selected.context, colors)
}
}
728x90
반응형
'Programming > Android' 카테고리의 다른 글
Fxxking Deprecated List (0) | 2021.12.15 |
---|---|
Fragment에서 뒤로 가기 ? (0) | 2021.11.18 |
res/layout 나누기 (0) | 2021.11.01 |