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

Я создаю в своем приложении набор программных View s. Как оказалось, все они по умолчанию имеют одинаковый id = -1 . Для работы с ними мне нужно сгенерировать уникальные идентификаторы.

Я пробовал несколько подходов - генерация случайных чисел и на основе текущего времени, но в любом случае нет 100% гарантии, что разные представления будут иметь разные идентификаторы

Просто интересно, есть ли более надежный способ генерировать уникальные? Возможно, существует специальный метод / класс?

29
задан Barmaley supports Monica 22 July 2011 в 13:22
поделиться

2 ответа

Просто хочу добавить к ответу Кая, с уровня API 17, вы можете позвонить

View.generateViewId ()

, а затем использовать 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, чтобы избежать конфликтов со статическими идентификаторами ресурсов.

54
ответ дан 28 November 2019 в 00:37
поделиться

Начиная с поддержки библиотеки 27.1.0, есть generateViewId () во ViewCompat

ViewCompat.generateViewId ()

13
ответ дан 28 November 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: