Intereting Posts
Как установить маржу в диалоге Полноэкранный просмотр без растягивания видео Перетаскиваемый ящик с ручкой (вместо панели действий) поверх других приложений Изображение Android Rotate с ExifInterface не работает Использование эмулятора Genymotion с ионной структурой Eclipse переходит в класс в Android Пользовательская панель заголовка с прогрессом в Android Android «Не удалось найти стиль« mapViewStyle »в текущей теме» Получать не подключенные устройства, когда мое устройство находится в режиме привязки Утилита instanceState для Android активирована во время обновления приложения? Android Динамически загружает Listview в конец прокрутки? Добавить кнопку на экран предпочтений Android pubnub chat с использованием синтаксического анализа, который дает неверную ошибку ключа аутентификации GetFragmentManager.findFragmentByTag () возвращает null Знак Dollar ($) после имени класса активности в журналах Android (неанонимный внутренний класс)

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

В моем приложении я создаю Views – в этом случае EditText – динамически. Но каждый View я добавляю, должен иметь уникальный идентификатор.

 EditText editText = new EditText(context); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); editText.setLayoutParams(params); // Which value am I supposed to use here? editText.setId(value); layout.addView(editText); 

Я боюсь конфликтов, если назначаю случайное значение, и я не могу думать о возможности генерации идентификаторов без возможности конфликтов.

Пожалуйста, не знаю, что я знаю, что можно определить фиксированный набор идентификаторов в res / values ​​/ ids.xml, но это не то, что я хочу! Мне нужно создать идентификаторы динамически! Я понятия не имею, сколько мне нужно.

Так есть ли безопасный способ создания идентификаторов?

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

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

Обычно мы делаем:

Чтобы назначить id –

 for(int i =0 ; i < yourIDcount ; i++){ yourView.setId(i); } 

Чтобы получить идентификатор –

 View.findViewById(yourView.getId()); 

Также,

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

Проверьте:

Как-can-i-assign-an-id-to-view-programatically и android-assign-and-retrieve-ids-динамически .

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


Статическое создание фиксированного количества идентификаторов

Создайте новый xml-файл в res / values, названный ids.xml, и добавьте элементы с идентификатором типа:

 <?xml version="1.0" encoding="utf-8"?> <resources> <item name="name" type="id" /> <!-- Creates the id R.id.name --> <item name="example" type="id" /> <!-- Creates the id R.id.example --> </resources> 

Вы также можете создавать идентификаторы для других ресурсов! Просто измените тип.


Динамическое создание идентификаторов от уровня API 17+

С уровнем API 17 в класс View был добавлен новый метод:

 int id = View.generateViewId(); 

С его помощью вы можете создать столько идентификаторов, сколько потребуется динамически!


Динамическое создание идентификаторов до уровня API 17

Поскольку @Apoorv предложил вам посмотреть исходный код generateViewId() здесь . Копируя код, мы можем использовать этот метод еще до уровня API 17:

 private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); public static int generateViewId() { for (; ; ) { final int result = sNextGeneratedId.get(); // aapt-generated IDs have the high byte nonzero; clamp to the range under that. int newValue = result + 1; if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. if (sNextGeneratedId.compareAndSet(result, newValue)) { return result; } } } 

Просто включите его в класс помощника, и все готово!