В XML-файле мы можем назначить идентификатор для подобного представления, android:id="@+id/something"
а затем вызвать findViewById()
, но как программно создать представление, как назначить идентификатор?
Я думаю, что setId()
это не то же самое, что назначение по умолчанию. setId()
это дополнительно.
Кто-нибудь может меня поправить?
Ответы:
id
Обзор AndroidAndroid
id
- это целое число, обычно используемое для идентификации представлений; этоid
может быть назначено через XML (когда это возможно) и через код (программно.). Этоid
наиболее полезно для получения ссылок на определенные XML-данные,View
сгенерированныеInflater
(например, с помощьюsetContentView
.)Назначить
id
черезXML
android:id="@+id/
somename"
к вашему представлению.android:id
ему будет присвоен уникальныйint
код для использования в коде.android:id
«секint
значения в коде с помощью„R.id.
SomeName“(фактически константы) .int
может измениться от сборки к сборке, поэтому никогда не копируйте идентификатор изgen/
package.name/R.java
, просто используйте «R.id.
somename».id
присвоениеPreference
в XML не используется, когдаPreference
генерирует егоView
.)Назначить
id
через код (программно)id
с использованиемsomeView.setId(
int);
int
Должен быть положительным, но в противном случае arbitrary- это может быть все , что вы хотите (продолжайте читать , если это страшно.)Уникальность
id
сXML
назначенныйid
s будет уникальным.id
ей ничего не должны быть уникальнымиid
s может (теоретически) конфликтовать сXML
-assignedid
s.id
s не будут иметь значения, если их правильно запросить (продолжайте читать) .Когда (и почему) конфликтующие
id
s не имеют значенияfindViewById(int)
будет рекурсивно выполнять итерацию в глубину по иерархии представления из указанного вами представления и возвращать первоеView
найденное совпадениеid
.id
определеннойid
в XML , нет назначенных кодов ,findViewById(R.id.somename)
они всегда будут возвращать вид, определенный в XML, так чтоid
'd.Динамически Создание представлений и назначая
ID
секViewGroup
сid
.LinearLayout
сandroid:id="@+id/placeholder"
.ViewGroup
сView
с.id
s, которые удобны для каждого представления.Запросите эти дочерние представления, используя placeholder.findViewById (cozyInt);
Введен API 17,
View.generateViewId()
который позволяет генерировать уникальный идентификатор.Если вы решите хранить ссылки на свои представления , обязательно создайте для них экземпляр
getApplicationContext()
и обязательно установите для каждой ссылки значение null inonDestroy
. Видимо утечки наActivity
(висит на это после того, как уничтожается) расточительно .. :)Зарезервируйте XML
android:id
для использования в кодеAPI 17 представил,
View.generateViewId()
который генерирует уникальный идентификатор. (Спасибо take-chances-make-changes за указание на это.) *Если ваш
ViewGroup
не может быть определен с помощью XML (или вы не хотите, чтобы он был), вы можете зарезервировать идентификатор с помощью XML, чтобы убедиться, что он остается уникальным:Здесь values / ids.xml определяет пользовательский
id
:Затем, когда ViewGroup или View были созданы, вы можете прикрепить пользовательский идентификатор
Противоречивый
id
примерДля ясности на примере запутывания давайте рассмотрим, что происходит, когда
id
за кадром возникает конфликт.макет / mylayout.xml
Для имитации конфликта, скажем, наша последняя сборка assign
R.id.placeholder
(@+id/placeholder
) имеетint
значение12
..Далее, MyActivity.java определяет некоторые добавления представления программно (через код):
Таким образом,
placeholder
и у одного из наших новыхTextView
естьid
12! Но на самом деле это не проблема, если мы запросим дочерние представления заполнителя:*Не так уж и плохо
источник
findViewById
выполняется исследование в глубину, поэтому «Пока нет идентификаторов, назначенных коду, назначенных над идентификатором, определенным в XML в иерархии», это технически неверно; это «до», а не «выше».ids.xml
. Для действительно произвольных идентификаторов используйтеView.generateViewId()
(API 17). (Пожалуйста, уточните свою точку зрения, если я пропустил это.)PreferenceDialogFragmentCompat
него, кажется, идентификаторы изR.id
не соответствуют иерархии представления. Таким образом, я не могу найти вид по ID.Вы можете просто использовать
View.setId(integer)
для этого. В XML, даже если вы устанавливаете идентификатор String, он преобразуется в целое число. В связи с этим вы можете использовать любое (положительное) целое число для программногоViews
добавления.Кредиты на этот ответ .
источник
Да, вы можете вызвать
setId(value)
любое представление с любым (положительным) целочисленным значением и затем найти его в родительском контейнере, используяfindViewById(value)
. Обратите внимание, что допустимо вызыватьsetId()
с одним и тем же значением для разных одноуровневых представлений, ноfindViewById()
вернет только первое.источник
findViewById
известного предка является хорошей идеей из соображений производительности, но он не гарантирует, что он найдет ближайшего ребенка, если есть ребенок с правильным ID.