Android: разные макеты, в которых есть элементы с одинаковыми точными идентификаторами - работает, но почему? - PullRequest
4 голосов
/ 19 октября 2011

Я работал над приложением сегодня вечером и заметил, что у меня есть два похожих действия, которые имеют разные макеты (mylayout1.xml и mylayout2.xml) ... но в этих макетах у меня есть некоторые элементы, которые идентичны, вплоть до их идентификаторы ("@ + id / mybutton" в каждом файле макета).

Когда я устанавливаюContentView (R.layout.mylayout1) в действии, а затем нахожу FindViewById (R.id.mybutton) для выполнения setOnClickListener (), как Android «узнает», на какую кнопку я действительно ссылаюсь, когда я наконец нажимаю это?

Кажется, что все работает просто отлично, при этом запускаются соответствующие обратные вызовы (и не, насколько я могу судить, переход к неправильной активности - хотя пока в моих тестах пока только один отображается на экране (например, действия диалогового типа.) Мне просто приходит в голову (как я заметил это дублирование во время несвязанной работы), что, возможно, это работает просто случайно, а не над дизайном. OTOH, если Android умничает с этим, я не буду волноваться так долго поскольку более одного экземпляра такого элемента никогда не отображается на экране одновременно (например, кнопки ОК).

Ответы [ 2 ]

4 голосов
/ 19 октября 2011

Когда вы вызываете setContentView, иерархия представления из XML анализируется и создается. Когда вы затем ищете представление с определенным идентификатором, android будет изучать эту иерархию представлений и искать представление с соответствующим идентификатором. Таким образом, вы никогда не получите элемент представления, который определен в каком-то другом XML-файле с тем же идентификатором, поскольку эти элементы представления не являются частью иерархии представления действий.

1 голос
/ 19 октября 2011

Это связано с тем, что метод setContentView (View) устанавливает в явном виде содержимое документа для содержимого действия в явном представлении, а finbViewById (int id) ссылается на объект представления, который вы установили с помощью setContentView.На самом деле, если вы ссылаетесь на элемент, который вы неправильно настроили, происходит сбой приложения с исключением нулевого указателя ...

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