Я пытаюсь написать простое приложение Android в Kotlin, которое изменяет цвета различных представлений.
У меня есть следующий код для инициализации представлений и прослушивателей щелчков (частные объявления lateinit ранее из конечно):
private fun setListeners()
{
boxOneText = findViewById(R.id.box_one_text)
boxTwoText = findViewById(R.id.box_two_text)
boxThreeText = findViewById(R.id.box_three_text)
boxFourText = findViewById(R.id.box_four_text)
boxFiveText = findViewById(R.id.box_five_text)
btnRed = findViewById(R.id.button_red)
btnYellow = findViewById(R.id.button_yellow)
btnBlue = findViewById(R.id.button_blue)
val rootLayout = findViewById<View>(R.id.constraint_layout)
// Set click listener for all text views
val views = listOf<View>(boxOneText, boxTwoText, boxThreeText, boxFourText, boxFiveText, rootLayout)
views.map { view -> view.setOnClickListener { makeColored(it) } }
// Set click listener for all buttons
val buttons = listOf(btnRed, btnYellow, btnBlue)
buttons.map { button -> button.setOnClickListener { makeSpecificColor(it, views) } }
}
Код для установки цветов отдельных TextViews выглядит так и работает (не обращайте внимания на запись lockdown_earth для box_two, я играл с разными вещами):
private fun makeColored(view: View)
{
when(view.id)
{
R.id.box_one_text -> view.setBackgroundColor(Color.DKGRAY)
R.id.box_two_text -> view.setBackgroundResource(R.drawable.lockdown_earth)
R.id.box_three_text -> view.setBackgroundColor(Color.BLUE)
R.id.box_four_text -> view.setBackgroundColor(Color.MAGENTA)
R.id.box_five_text -> view.setBackgroundColor(Color.BLUE)
else -> view.setBackgroundColor(Color.LTGRAY)
}
}
Однако следующий код для изменения цвета всех TextView (включая rootLayout) не работает не работает :
// In this context, view is a Button
private fun makeSpecificColor(view: View, views: List<View>)
{
// TODO For some reason the id doesn't match??
val color = when(view.id)
{
R.id.button_yellow -> R.color.my_yellow
R.id.button_red -> R.color.my_red
R.id.button_blue -> R.color.my_blue
else -> R.color.colorPrimary
}
views.map { it.setBackgroundColor(color) }
}
Как указано в моем TODO , по какой-то причине идентификатор представления равен НЕ тем, что было до запуска clickListener, и всегда вводится «else». Я запустил это в режиме отладки, и переданный идентификатор не соответствует ни одному из представлений, которые у меня есть во всем приложении. Присваивается ли каким-то образом новый ID? Если да, то почему TextView работают со своим слушателем?
Это связано с тем, что я использую карту в списке кнопок? Я как бы слепо использовал это как замену l oop.