Вынуждает ли R.java все мои элементы макета стать открытыми переменными на основе их идентификаторов? - PullRequest
1 голос
/ 05 декабря 2011

Я предположил, что идентификаторы элементов каждого макета, такие как кнопки, текстовые представления, тексты редактирования и т. Д., Являются уникальными и частными для этого макета. При этом вы устанавливаете активность для использования определенного макета, вы должны только найти идентификаторы представлений на основе идентификатора, установленного в этом конкретном макете.

Однако теперь я обнаружил, что могу ссылаться на любой идентификатор представления, который мне нужен из моей Деятельности, независимо от физического макета, который я указал с помощью "setContentView (R.layout.THELAYOUTIWANTTOTARGET)". Это нормальное поведение, я полагал, что будут доступны только идентификаторы тех элементов в указанном выше макете? Глядя на R.java, я считаю, что все идентификаторы, которые я указал во всех макетах, стали открытыми переменными, поэтому никакие идентификаторы не могут иметь одинаковые имена, иначе может произойти непредвиденное поведение!

Значение этого для моего проекта заключается в том, что теперь я должен изменить все идентификаторы во всех макетах, чтобы они были уникальными. Я полагал, что мой макет поставщика> вид текста заголовка отличался бы от моего макета клиента> вид текста заголовка, не так ли?

Спасибо за разъяснения!

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

Ваше предположение верно. IDS носят глобальный характер, и для больших проектов иногда бывает трудно, что приводит к очень длинным именам ID. Но это также может быть использовано в качестве преимущества, так как вы можете повторно использовать макеты для различных действий.

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

Метод findViewById будет работать только с той деятельностью, с которой вы его вызываете. Если кнопка (или любой другой компонент) существует в других действиях, будет возвращена только та, которая находится в вашем текущем действии.

2 голосов
/ 05 декабря 2011

Да, это нормально. Насколько я знаю, изменить это невозможно.

Так что да, подразумевается, что у вас должны быть разные имена для представлений в разных макетах, это правильно.

EDIT:

На самом деле ... поцарапайте это. У меня сложилось впечатление, что это необходимо, но согласно

http://developer.android.com/reference/android/view/View.html

даже нет необходимости иметь уникальные идентификаторы в одном файле. Просто убедитесь, что вы не ищете в дереве с несколькими одинаковыми идентификаторами, иначе вы всегда получите первое вхождение.

Это также имеет смысл, поскольку на самом деле не имеет значения, имеют ли представления одинаковый идентификатор в R. Я буду помнить об этом в будущем.

...