Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Если мы считаем, что 'this' - это Activity, настроенный с макетом, который содержит ваши кнопки, тогда:

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 );

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

Ответ 2

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

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

Ответ 3

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