Проблема с настройкой тегов при добавлении представлений программно - PullRequest
0 голосов
/ 09 ноября 2019

При добавлении TextView и двух ImageView s к root ConstraintLayout и программной установке ограничений, когда я устанавливаю Tag s представлений, происходит нечто странное.

Вот как ясоздайте вышеупомянутые представления и добавьте их для просмотра:

    val confirmLocationText = TextView(context!!)
    confirmLocationText.text = "Confirm?"
    confirmLocationText.textSize = 20f
    confirmLocationText.typeface = Typeface.DEFAULT_BOLD
    confirmLocationText.measure(0, 0)

    val confirmLocationTickImage = ImageView(context!!)
    confirmLocationTickImage.setImageResource(R.drawable.tick)
    confirmLocationTickImage.scaleType = ImageView.ScaleType.CENTER_CROP

    val confirmLocationCancelImage = ImageView(context!!)
    confirmLocationCancelImage.setImageResource(R.drawable.cancel)
    confirmLocationCancelImage.scaleType = ImageView.ScaleType.CENTER_CROP

    arrayOf(confirmLocationCancelImage, confirmLocationTickImage,confirmLocationText).forEach {
        it.id = View.generateViewId()
        it.tag = confirmInterfaceTag
        it.alpha = 0f
        viewToBeCreated?.eventMapFragmentRootConstraintLayout?.addView(it)
        it.animate().alpha(1f).duration = confirmInterfaceFadeInFadeOutAnimation // Fade-In animation for Confirm Interface
    }

И после этого куска кода я программно устанавливаю ограничения с помощью ConstraintSet.

Проблема возникает в forEach. Он запускается только дважды, но все три вида добавляются в любом случае (хотя один из ImageView не имеет назначенного тега, но анимация работает). Когда я удаляю confirmLocationCancelImage (или confirmLocationTickImage) из arrayOf, он снова запускается дважды, но на этот раз удаленный ImageView не будет добавлен.

Так что я не понимаю:

1) Почему forEach запускается дважды?

2) Когда он запускается дважды, почему добавляются три представления?

3) И когда он запускается дважды и тризатем добавляются представления, почему один из них пропускает тег?

Надеюсь, это не глупый вопрос, но мне показался странным и раздражающим. Заранее спасибо за помощь!

РЕДАКТИРОВАТЬ: Когда я изменяю код, как показано ниже, он работает, но я все еще не понимаю, почему он не работает, как указано выше ...

    val confirmLocationText = TextView(context!!)
    confirmLocationText.text = "Confirm?"
    confirmLocationText.textSize = 20f
    confirmLocationText.typeface = Typeface.DEFAULT_BOLD
    confirmLocationText.measure(0, 0)

    val confirmLocationTickImage = ImageView(context!!)
    confirmLocationTickImage.apply {
        setImageResource(R.drawable.tick)
        id = View.generateViewId()
        tag = confirmInterfaceTag
        alpha = 0f
        viewToBeCreated?.eventMapFragmentRootConstraintLayout?.addView(this)
        animate().alpha(1f).duration = confirmInterfaceFadeInFadeOutAnimation
        scaleType = ImageView.ScaleType.CENTER_CROP
    }

    val confirmLocationCancelImage = ImageView(context!!)
    confirmLocationCancelImage.setImageResource(R.drawable.cancel)
    confirmLocationCancelImage.scaleType = ImageView.ScaleType.CENTER_CROP

    arrayOf(confirmLocationCancelImage,confirmLocationText).forEach {
        it.id = View.generateViewId()
        it.tag = confirmInterfaceTag
        it.alpha = 0f
        viewToBeCreated?.eventMapFragmentRootConstraintLayout?.addView(it)
        it.animate().alpha(1f).duration = confirmInterfaceFadeInFadeOutAnimation // Fade-In animation for Confirm Interface
    }
...