Intereting Posts
Как определить фрагмент, восстановленный из backstack Как я могу обнаружить нажатие на экране? Выровнять верхнюю часть изображения вверху TextView Как открыть конкретное SMS-сообщение в андроиде Dx неподдерживаемый файл класса версии 52.0 … при разборе com / example / test1 / BuildConfig.class Фрактальные приложения на Android Как рисовать путь, когда я двигаюсь, начиная с моего текущего местоположения, используя Карты Google Android, найти все места в коде для запроса разрешений Android Place Picker закрывается сразу после запуска Мобильная разработка – родной VS Cross Platform VS JavaScript Камера Android заблокирована после закрытия силы Android.intent.action.BOOT_COMPLETED Цель не получена при перезагрузке или перезагрузке. Обновление Android Studio 2.2: выровненный APK (zipAlign), не сгенерированный с использованием нового Gradle Plugin 2.2.0 Библиотека поддержки Android Прямая ссылка для скачивания Как разработать / перенести родную библиотеку C в android?

Как я могу назначить идентификатор для представления программно?

В XML-файле мы можем назначить идентификатор представлению типа android:id="@+id/something" а затем вызвать findViewById() , но при создании представления программно, как назначить идентификатор?

Я думаю, что setId() не совпадает с назначением по умолчанию. setId() является дополнительным.

Кто-нибудь может меня исправить?

Solutions Collecting From Web of "Как я могу назначить идентификатор для представления программно?"

Обзор id Android

id Android – это целое число, обычно используемое для идентификации видов; Этот id может быть назначен через XML (по возможности) и с помощью кода (программно). id наиболее полезен для получения ссылок для XML-определенного View s, созданного Inflater (например, с помощью setContentView .)

Назначить id через XML

  • Добавьте к вашему представлению атрибут android:id="@+id/ somename " .
  • Когда ваше приложение будет построено, android:id будет присвоен уникальный int для использования в коде.
  • Ссылка на значение вашего android:id в коде с помощью « R.id. somename» (эффективно константа).
  • Этот int может измениться из build to build, поэтому никогда не копируйте id из gen/ package.name/ R.java , просто используйте « R.id. somename».
  • (Кроме того, id присвоенный Preference в XML, не используется, когда Preference генерирует его View .)

Назначить id по коду (программно)

  • Вручную установите id с помощью someView.setId( int );
  • int должен быть положительным, но в противном случае произвольным – он может быть любым, что вы хотите (продолжайте читать, если это страшно).
  • Например, при создании и нумерации нескольких представлений, представляющих элементы, вы можете использовать их номер позиции.

Единственность id s

  • id XML id будет уникальным.
  • id присвоенные id , не обязательно должны быть уникальными
  • id кодом id могут (теоретически) конфликтуют с XML назначенными id .
  • Эти конфликтующие id не будут иметь значения, если правильно спросить (продолжать чтение) .

Когда (и почему) конфликтующие id не имеют значения

  • findViewById(int) будет перебирать глубину сначала рекурсивно через иерархию представлений из указанного вами вида и возвращать первое View которое находит с соответствующим id .
  • До тех пор, пока не назначены id кода, назначенные до id определенного XML в иерархии, findViewById(R.id.somename) всегда будет возвращать XML-представление View, поэтому id 'd.

Динамическое создание представлений и присвоение ID

  • В макете XML определите пустую ViewGroup с id .
  • Например, LinearLayout с android:id="@+id/placeholder" .
  • Используйте код, чтобы заполнить ViewGroup с помощью View s.
  • Если вам нужно или нужно, назначьте любые id , которые удобны для каждого вида.
  • Запросите эти дочерние представления, используя placeholder.findViewById (удобныйInt);

  • В API 17 представлен View.generateViewId() который позволяет вам генерировать уникальный идентификатор.

Если вы решите сохранить ссылки на свои взгляды , обязательно getApplicationContext() их с помощью getApplicationContext() и обязательно установите для каждой ссылки значение null в 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 есть 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); 

*Не так плохо

Для этого вы можете просто использовать View.setId(integer) . В XML, даже если вы устанавливаете идентификатор String, он преобразуется в целое число. Благодаря этому вы можете использовать любое (положительное) целое число для программ, которые вы добавляете программно.

Согласно документации View

Идентификатор не должен быть уникальным в иерархии этого представления. Идентификатор должен быть положительным числом.

Таким образом, вы можете использовать любое положительное целое число, которое вам нравится, но в этом случае могут быть некоторые представления с эквивалентными идентификаторами. Если вы хотите найти какое-то представление в иерархии, вызов может быть полезным при вызове setTag с некоторыми ключевыми объектами.

Кредиты на этот ответ .

Да, вы можете вызвать setId(value) в любом представлении с любым (положительным) значением целого числа, которое вам нравится, а затем найти его в родительском контейнере с помощью findViewById(value) . Обратите внимание, что для вызова setId() использовать одно и то же значение для разных представлений sibling, но findViewById() вернет только первый.