Android / Kotlin - Как зациклить все кнопки ToggleButtons для условия if / else - PullRequest
0 голосов
/ 05 января 2019

У меня есть следующая группа toggleButtons (зеленая отмечена, а остальные не отмечены) в adapter:

enter image description here

Я пытаюсь найти решение , чтобы не делать этого во всех кнопках toggle:

           holder.eleven.setOnCheckedChangeListener { buttonView, isChecked ->
                if(isChecked == true){
                    holder.eleven.setTextColor(Color.WHITE)
                } else {
                    holder.eleven.setTextColor(Color.BLACK)
                }
            }

Я хочу иметь оператор if / else, который будет выполнять предыдущую работу (установить цвет текста) для всех toggleButtons.

Я пытался указать массив для запуска в цикле, но не работал :

           val array = arrayOf(R.id.one,
                    R.id.two,
                    R.id.three,
                    R.id.four,
                    R.id.five,
                    R.id.six,
                    R.id.seven,
                    R.id.eight,
                    R.id.nine,
                    R.id.ten,
                    R.id.eleven)
            for (i in array.indices) {
                array[i].setOnCheckedChangeListener { _, isChecked ->
                    if (isChecked) {
                        array[i].setTextColor(Color.WHITE)
                    } else {
                        array[i].setTextColor(Color.BLACK)
                    }
                }
             }

Вы знаете, как я могу сделать это лучше? Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Ваш массив должен быть:

val array = arrayOf(
    holder.one, holder.two, holder.three, holder.four, holder.five, holder.six, 
    holder.seven,  holder.eight, holder.nine, holder.ten, holder.eleven)

и затем:

for (i in array.indices) {
    array[i].setOnCheckedChangeListener { _, isChecked ->
        array[i].setTextColor(if (isChecked) Color.WHITE else Color.BLACK)
    }
}

или

array.forEach { 
   it.setOnCheckedChangeListener { v, isChecked ->
       v.setTextColor(if (isChecked) Color.WHITE else Color.BLACK)
   } 
}
0 голосов
/ 05 января 2019

Ваш цикл неправильный. У вас есть массив Int, а затем вы пытаетесь установить слушателей на этих Ints. Это не сработает.

Попробуйте вместо этого:

//I recommend putting this array inside a companion object or as a global variable
//There's no need to reinitialize it every time the containing method is called
val buttons = arrayOf(
    R.id.one,
    R.id.two,
    R.id.three,
    R.id.four,
    R.id.five,
    R.id.six,
    R.id.seven,
    R.id.eight,
    R.id.nine,
    R.id.ten,
    R.id.eleven
)

//No need to manually reference an index and then retrieve it.
//Kotlin does it for you
buttons.forEach { //"it" is a reference to the current array element
    val button = holder.findViewById<ToggleButton>(it)

    button.setOnCheckedChangeListener { _, isChecked ->
        //if-else statements are expressions in Kotlin, and can be used like Java ternaries
        //which simplifies your expression
        button.setTextColor(if (isChecked) Color.WHITE else Color.BLACK)
    }
}

(Кстати, если вы не используете что-то другое, это ToggleButton, а не ToogleButton.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...