Андройд. Почему не получается повесить слушатель на всю разметку активити?
Пытаюсь повесить один слушатель на всю разметку, т.е. на 2 TextView элемента и одну кнопку, событие вешается на root. Код ниже. С TextView срабатывает, а вот для Button приходится делать отдельный слушатель. Почему так, ведь Button, также наследуется от View? Или я допускают ошибку в коде?
class TextExchangeActivity : AppCompatActivity() {
private lateinit var textView: TextView;
private lateinit var textViewTwo: TextView
private lateinit var button: Button
private lateinit var view: View
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
textView = binding.textView
textViewTwo = binding.textView2
button = binding.button
view = binding.root
fun change() {
val textViewFirstText = textView.text
val textViewSecondText = textViewTwo.text
textView.text = textViewSecondText //textViewTwo.text
textViewTwo.text = textViewFirstText //textView.text
val colorFirst = textView.background;
val colorSecond = textViewTwo.background;
textView.background = colorSecond;
textViewTwo.background = colorFirst;
}
button.setOnClickListener {
change()
}
view.setOnClickListener {
change()
}
}
}
Ответы (2 шт):
View-иерархия не имеет никакого отношения к наследованию классов - дочерние элементы не наследуют слушатели от контейнера.
Контейнер сам их обрабатывает: в первую очередь делегирует дочернему элементу, по которому кликнули и только в том случае если клик не обработал ни один дочерний элемент, вызывает свой слушатель.
Кнопка должна подсвечиваться при нажатии, поэтому перехватывает клик в любом случае, даже если ей не назначен слушатель - поэтому слушатель, назначенный контейнеру не вызывается.
Вы используете
binding. зачем выbinding.textView2сокращаете доtextViewTwo?
bindingспециально был создан для легкого и быстрого доступа к элементам с указанием лишь переменной самогоbinding'а.ваше
view = binding.root- это не элемент, а абсолютная ВСЯ разметка (и пустое пространство в том числе).