id
Обзор Android
Android 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
-assigned id
s.
- Эти конфликтующие
id
s не будут иметь значения, если их правильно запросить (продолжайте читать) .
Когда (и почему) конфликтующие id
s не имеют значения
findViewById(int)
будет рекурсивно выполнять итерацию в глубину по иерархии представления из указанного вами представления и возвращать первое View
найденное совпадение id
.
- До тех пор, пока в иерархии,
id
определенной id
в XML , нет назначенных кодов , findViewById(R.id.somename)
они всегда будут возвращать вид, определенный в XML, так что id
'd.
Динамически Создание представлений и назначая ID
сек
- В макете XML определите пустое значение
ViewGroup
с id
.
- Такие как
LinearLayout
с android:id="@+id/placeholder"
.
- Используйте код для заполнения заполнителя
ViewGroup
с View
с.
- Если вам нужно или хотите, назначьте любые
id
s, которые удобны для каждого представления.
Запросите эти дочерние представления, используя placeholder.findViewById (cozyInt);
Введен API 17, View.generateViewId()
который позволяет генерировать уникальный идентификатор.
Если вы решите хранить ссылки на свои представления , обязательно создайте для них экземпляр getApplicationContext()
и обязательно установите для каждой ссылки значение null in onDestroy
. Видимо утечки на Activity
(висит на это после того, как уничтожается) расточительно .. :)
Зарезервируйте XML android:id
для использования в коде
API 17 представил, View.generateViewId()
который генерирует уникальный идентификатор. (Спасибо take-chances-make-changes за указание на это.) *
Если ваш ViewGroup
не может быть определен с помощью XML (или вы не хотите, чтобы он был), вы можете зарезервировать идентификатор с помощью XML, чтобы убедиться, что он остается уникальным:
Здесь values / ids.xml определяет пользовательский id
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Затем, когда ViewGroup или View были созданы, вы можете прикрепить пользовательский идентификатор
myViewGroup.setId(R.id.reservedNamedId);
Противоречивый id
пример
Для ясности на примере запутывания давайте рассмотрим, что происходит, когда id
за кадром возникает конфликт.
макет / mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
Для имитации конфликта, скажем, наша последняя сборка assign R.id.placeholder
( @+id/placeholder
) имеет int
значение 12
..
Далее, MyActivity.java определяет некоторые добавления представления программно (через код):
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
Таким образом, placeholder
и у одного из наших новых TextView
есть id
12! Но на самом деле это не проблема, если мы запросим дочерние представления заполнителя:
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*Не так уж и плохо