Почему мой идентификатор представления кнопки меняется во время выполнения? - PullRequest
1 голос
/ 09 мая 2020

Я пытаюсь написать простое приложение 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.

1 Ответ

0 голосов
/ 17 мая 2020

Оказалось, проблема в том, что я использовал неправильный метод для установки цвета фона. Вместо использования setBackgroundColor() мне нужно было использовать setBackgroundResource().

К сожалению, отладчик не распознает идентификаторы ресурсов правильно, потому что он отправил меня в кроличью нору, пытаясь исправить неправильную проблему.

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