Intereting Posts
LoaderManager с несколькими загрузчиками: как получить правильный загрузчик курсора Прозрачный размытый вид, который размывает макет под Обновление прокрутки триггеров вместо раскрытия панели инструментов Как изменить фон виджета вкладки Android? Жизненный цикл фрагментов – какой метод вызывается для show / hide? Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон Как создать прозрачную активность WITHOUT windowIsFloating Необходима миграция из GCM в FCM? Выполнение запроса HTTPS с использованием Android Volley Как изменить изображения по умолчанию CheckBox Чтение андроида jpeg EXIF ​​метаданные из обратного вызова изображения Предварительный просмотр горизонтальной обработки в андроид-студии Android obfuscate приложение с помощью proguard поддерживает обфускацию библиотечных банок – или это так? Как объявить макет для 7'inch планшета Android? Разница между поддержкой android-v7-appcompat и android-support-v4

Два вида с одинаковым идентификатором

Как андроид использует R.id.id_name для поиска представлений после раздувания XML?

1. Предположим, у меня есть два XML с одной кнопкой, каждая с одинаковым идентификатором.

2. Я раздул их и превратил их в представления

3. В классе R.id для обеих кнопок будет создан только один int .

Как андроид дифференцирует эти кнопки с одним и тем же идентификатором. Используя одно и то же имя ресурса (R.id.id_name).

Solutions Collecting From Web of "Два вида с одинаковым идентификатором"

Идентификатор не является уникальной ссылкой.

Однако на практике вы различаете, используя родительское представление.

Если мы считаем, что «это» – это активность, настроенная с макетом, который содержит ваши кнопки, тогда:

 Button button = (Button) this.findViewById( R.id.id_name ); 

Вернет первый, который он найдет в макете (я думаю – не уверен, что фактическое поведение определено).

Однако то, что вы можете сделать, это вызвать findViewById на каком-то родительском представлении, которое содержит только один такой экземпляр с этим идентификатором.

 LinearLayout okParent = (LinearLayout) this.findViewById( R.id.okLayout ); LinearLayout cancelParent = (LinearLayout) this.findViewById( R.id.cancelLayout ); Button okButton = (Button) okParent.findViewById( R.id.id_name ); Button cancelButton = (Button) cancelParent.findViewById( R.id.id_name ); 

Концептуально, это своего рода поиск по пути. Вы должны быть осторожны при разработке своих макетов, чтобы это было возможно.

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

Значение R.id.foo одинаково для двух разных макетов, содержащих элемент управления с идентификатором foo . Поскольку они не конкурируют за уникальность, это не имеет значения.

Он знает, какой View следует использовать, потому что он ищет View с этим конкретным id в XML-файле, который в настоящее время установлен как просмотр контента (или завышен).