Могу ли я использовать один и тот же идентификатор в другом макете в 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макета, а затем исправьте красную ошибку внутри макета.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.