Чи можу я використовувати один і той же ідентифікатор в іншому макеті в Android?


90

Я новачок у розробці Android. Чи добре використовувати один і той же ідентифікатор для зображень та TextViewsу різних LayoutXML-файлах?

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



@Pavel вам все одно знадобляться ідентифікатори для регулювання обмежень.
Садда Хуссейн,

Відповіді:


96

Рекомендується використовувати різні ідентифікатори для різних макетів. У довгостроковій перспективі, коли у вас буде багато макетів і тому багато ідентифікаторів, буде дуже складно їх диференціювати.

Я зазвичай називають свої ідентифікатори , як це: layoutName_elementId.

Мені вдається легко знайти ідентифікатор, який я шукаю, особливо при використанні автозаповнення (я знаю, на якому макеті я працюю, але я насправді не знаю ідентифікатора; у цьому випадку, з моєю стратегією іменування, я введіть лише ім'я макета, і воно відображає всі ідентифікатори цього макета).

Більше інформації про макети та ідентифікатори можна знайти тут .

Щасливого кодування,


2
Яка проблема пошуку, скажімо, ok_buttonу кожній вашій діяльності? Автозавершення стає ще зрозумілішим, якщо ви знаєте, що шукаєте в чаті.
Dan Chaltiel

132

Коротка відповідь: Так, ви можете.

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


15
Чи можете ви дати ще довшу відповідь? Оскільки R.id.layout_id є статичним цілим числом і заздалегідь визначається під час компіляції, тому findViewById () не знатиме завищеного в даний час макета.
Хлоя

22
Заради когось іншого, хто стикається з цим питанням, я хотів відповісти на прохання Хлої. Ідентифікатор буде однаковим для кожного представлення даних, але ніколи не відображатиметься двічі під час однієї дії. Як метафору розгляньте, що могло б статися, якби я дав вам стос паперів, на яких було ціла низка цифр. На кількох із цих аркушів паперу написано номер 4. Ви дивитесь на один з аркушів, і я прошу вас обвести 4. Це легко. Тепер ви дивитесь на інший аркуш, на якому є 4. Ви також можете знайти і обвести це. Неважливо, що номер визначений заздалегідь.
Тед Каннелонго,

6
Я не згоден з коментарем Теда, ви можете мати одночасно два компоненти з однаковим ідентифікатором, що працюють в одній і тій же діяльності. У мене щойно виникла проблема з додатком, я використовував два різні ViewPager одночасно для основної діяльності. Коли я намагався отримати ViewPager, який зараз відображається з ідентифікатором, він фактично отримав інший, що працює у фоновому режимі. Я вирішив проблему, просто зробивши два ідентифікатори унікальними.
Йоанн Еркуе,

8
@YoannHercouet Я вважаю, що це тому, що обидва були на одному аркуші (Діяльність)
Naheel

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.