Я создаю в своем приложении набор программных View
s. Как оказалось, все они по умолчанию имеют одинаковый id = -1
. Для работы с ними мне нужно сгенерировать уникальные идентификаторы.
Я пробовал несколько подходов - генерация случайных чисел и на основе текущего времени, но в любом случае нет 100% гарантии, что разные представления будут иметь разные идентификаторы
Просто интересно, есть ли более надежный способ генерировать уникальные? Возможно, существует специальный метод / класс?
Просто хочу добавить к ответу Кая, с уровня API 17, вы можете позвонить
, а затем использовать View.setId (int ) метод.
Если вам это нужно для целей ниже уровня 17, вот его внутренняя реализация в View.java, которую вы можете использовать непосредственно в своем проекте:
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
/**
* Generate a value suitable for use in {@link #setId(int)}.
* This value will not collide with ID values generated at build time by aapt for R.id.
*
* @return a generated ID value
*/
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;
}
}
}
Идентификационный номер больше 0x00FFFFFF зарезервирован для статического представления, определенные в файлах / res XML. (Скорее всего, 0x7f ****** из R.java в моих проектах.)
Из кода почему-то Android не хочет, чтобы вы использовали 0 в качестве идентификатора представления, и это должно быть перевернул перед 0x01000000, чтобы избежать конфликтов со статическими идентификаторами ресурсов.
Начиная с поддержки библиотеки 27.1.0, есть generateViewId () во ViewCompat