Могу ли я использовать один и тот же идентификатор в другом макете в Android?

90

Я новичок в разработке Android. Можно ли использовать один и тот же идентификатор для изображений и TextViewsв разных Layoutфайлах XML?

Когда eclipse автоматически перечисляет их для меня, он перечисляет все переменные макета из проекта, так что он столкнется? До сих пор я не заметил никаких проблем с использованием одного и того же идентификатора в разных макетах, но меня это беспокоит в долгосрочной перспективе.

счастливый
источник
@Pavel вам все равно понадобятся идентификаторы для корректировки ограничений.
Sadda Hussain

Ответы:

96

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

Я обычно называют свои идентификаторы , как это: layoutName_elementId.

Мне помогает легко найти идентификатор, который я ищу, особенно при использовании автозаполнения (я знаю, над каким макетом работаю, но я действительно не знаю идентификатор; в этом случае с моей стратегией именования я введите только имя макета, и оно отобразит все идентификаторы этого макета).

Более подробную информацию о макетах и ​​идентификаторах можно найти здесь .

Удачного кодирования,

Чупамобильный евангелист
источник
2
В чем проблема поиска, скажем, ok_buttonв каждом вашем занятии? Автозаполнение становится еще понятнее, если вы знаете чат, который ищете.
Дэн Чалтиэль
132

Краткий ответ: да, можно.

Длинный ответ: вы можете сделать это, потому что всякий раз, когда вы используете findViewById () для получения ссылки на часть вашего макета, метод ищет это представление только в текущем расширенном макете. Таким образом, даже если у вас есть другое представление с тем же идентификатором в другом макете, Android не будет искать его там.

Рагхав Суд
источник
15
Вы можете дать еще более длинный ответ? Поскольку R.id.layout_id является статическим целым числом и предварительно определяется во время компиляции, поэтому findViewById () не будет знать текущий раздуваемый макет.
Хлоя
22
Ради всех, кто сталкивается с этим вопросом, я хотел ответить на просьбу Хлои. Идентификатор будет одинаковым для каждого представления, но никогда не будет появляться дважды в одной и той же операции. В качестве метафоры представьте, что произошло бы, если бы я дал вам стопку бумаг с кучей цифр. На некоторых из этих листов бумаги написано число 4. Вы смотрите на один из листов, и я прошу вас обвести цифру 4. Это легко. Теперь вы смотрите на другой лист с цифрой 4. Вы также можете найти и обвести его. Неважно, что количество определено заранее.
Тед Каннелонго
6
Я не согласен с комментарием Теда, у вас может быть одновременно два компонента с одинаковым идентификатором, работающие в одном и том же Activity. У меня просто возникла проблема с приложением, я использовал два разных ViewPager одновременно в основном действии. Когда я попытался получить ViewPager, отображаемый в данный момент с идентификатором, он фактически получил другой, работающий в фоновом режиме. Я решил проблему, просто сделав два идентификатора уникальными.
Йоанн Эркуэ,
8
@YoannHercouet Я считаю, что это потому, что оба были на одном листе (
Действие
22

Согласно руководствам разработчиков API:

Идентификатор не обязательно должен быть уникальным во всем дереве, но он должен быть уникальным в пределах той части дерева, которую вы ищете (которая часто может быть всем деревом, поэтому по возможности лучше быть полностью уникальным).

Итак, краткий ответ: это не обязательно, но это хорошая практика, чтобы избежать возможных конфликтов.

Алекс Эпельде
источник
1
Однажды я случайно создал такие же идентификаторы. Позже отменить их переименование потребовало много работы, потому что все экземпляры были обновлены. Это означает, что если у вас есть конфликт идентификаторов, вы облажались. Будет очень сложно снова все отделить.
t3chb0t
@ t3chb0t По-настоящему! Даже если вы отметите «только локально», Android Studio переименовывает все экземпляры. Это просто смешно.
Джон Глен,
15

Не рекомендуется, потому что, если в будущем вам понадобится рефакторинг view id, студия Android выполнит рефакторинг во всех XMLфайлах и классах, и у вас возникнут проблемы.

Но бывают также случаи, когда вам действительно нужно использовать то же самое, idнапример, если у вас есть некоторый аннотация, и вы повторно используете несколько макетов.

Если у вас есть несколько таких viewsже id'sв вашем проекте, и вам нужно провести рефакторинг, сделайте это вручную, не используйте функцию сборки в IDE, измените idцелевой вид внутри XMLмакета, а затем исправьте красную ошибку внутри макета.

Павел Полей
источник