id
Огляд Android
Android id
- це ціле число, яке зазвичай використовується для ідентифікації представлень; це id
може бути призначено за допомогою XML (коли це можливо) та за допомогою коду (програмно.) id
Найбільш корисно для отримання посилань для визначених XML View
s, породжених Inflater
(наприклад, за допомогою setContentView
.)
Призначити id
черезXML
- Додайте атрибут
android:id="@+id/
SomeName "
до вашої думки.
- Коли ваша програма буде побудована,
android:id
присвоюється унікальний int
для використання код.
- Посилальна свій
android:id
«сек int
значення в коді з допомогою" R.id.
SomeName "(фактично константи) .
- це
int
може змінитися від збирання до складання, тому ніколи не копіюйте ідентифікатор з gen/
пакета.name/ R.java
, просто використовуйте " R.id.
somename".
- (Крім того,
id
призначений для Preference
XML не використовується, коли його Preference
генерується View
.)
Призначення id
за допомогою коду (програмно)
- Вручну встановити
id
s за допомогою someView.setId(
int);
- Обов'язково
int
має бути позитивним, але в іншому випадку довільним - це може бути все, що завгодно (читайте, якщо це страшно.)
- Наприклад, якщо створити та нумерувати кілька переглядів, що представляють елементи, ви можете використовувати їх номер.
Унікальність id
с
XML
-призначені id
s будуть унікальними.
- Присвоєні кодом
id
s не повинні бути унікальними
id
Теоретично присвоєний коду може конфліктувати з XML
-знаками id
.
- Ці конфліктні
id
s не мають значення, якщо їх правильно запитувати (тримати читання) .
Коли (і чому) конфліктні id
s не мають значення
findViewById(int)
буде повторювати глибину спочатку рекурсивно через ієрархію подання з вказаного Вами представлення і поверне перше, View
що знайде, зі збігом id
.
- Поки до ієрархії,
id
визначеної XML, не визначено коду id
, findViewById(R.id.somename)
завжди повертатиме визначений XML View так id
'd.
Динамічне створення переглядів та призначення ID
s
- У макеті XML визначте порожнє
ViewGroup
с id
.
- Такі як
LinearLayout
с android:id="@+id/placeholder"
.
- Використовуйте код для заповнення заповнювач
ViewGroup
з View
с.
- Якщо вам потрібно чи хочете, призначте будь-
id
які, зручні для кожного перегляду.
Запросити ці дочірні представлення за допомогою placeholder.findViewById (удобнийInt);
Представлено API 17, View.generateViewId()
який дозволяє генерувати унікальний ідентифікатор.
Якщо ви вирішите зберігати посилання на свої погляди навколо , не забудьте створити їх getApplicationContext()
та встановіть для кожного посилання нульове значення onDestroy
. Мабуть витоку на Activity
(висить на це після того, як знищується) марнотратно .. :)
Зарезервуйте XML android:id
для використання в коді
Представлено API 17, View.generateViewId()
який генерує унікальний ідентифікатор. (Завдяки шансам-внести зміни до вказівки на це.) *
Якщо ваш ViewGroup
неможливо визначити за допомогою XML (або ви не хочете, щоб це було), ви можете зарезервувати ідентифікатор за допомогою XML, щоб переконатися, що він залишається унікальним:
Тут значення / 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>
Щоб імітувати конфлікт, давайте скажемо, що наша остання збірка присвоїла 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
s має 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);
*Не так вже і погано