Я добавляю TextViews программно в цикл for и добавляю их в ArrayList.
Как я могу использовать TextView.setId(int id)
? Какой Integer ID мне нужен, чтобы он не конфликтовал с другими ID?
Я добавляю TextViews программно в цикл for и добавляю их в ArrayList.
Как я могу использовать TextView.setId(int id)
? Какой Integer ID мне нужен, чтобы он не конфликтовал с другими ID?
Согласно View
документации
Идентификатор не обязательно должен быть уникальным в иерархии этого представления. Идентификатор должен быть положительным числом.
Таким образом, вы можете использовать любое положительное целое число, которое вам нравится, но в этом случае могут быть некоторые представления с эквивалентными идентификаторами. Если вы хотите найти какое-то представление в иерархии, setTag
может пригодиться обращение к некоторым ключевым объектам.
findViewById
дает гарантии относительно того, какое представление возвращается, если существует более одного с одним и тем же идентификатором? В документах ничего не упоминается.findViewById
вернет первое, что он найдет.setContentView()
, скажем, 10 видов с идентификатором, установленным на один и тот же номер идентификатора в одной и той же иерархии , то при вызовеfindViewById([repeated_id])
будет возвращен первый набор с этим повторяющимся идентификатором. Это то, что я имел в виду.Начиная с уровня API 17 и выше, вы можете вызывать: View.generateViewId ()
Затем используйте View.setId (int) .
Если ваше приложение нацелено ниже уровня API 17, используйте ViewCompat.generateViewId ()
источник
AtomicInteger
реализацию методов.for(;;)
я такого никогда раньше не видел. Как это называется?Вы можете установить идентификаторы, которые будете использовать позже в
R.id
классе, используя файл ресурсов xml, и позволить Android SDK давать им уникальные значения во время компиляции.Чтобы использовать его в коде:
источник
"int currentId = 1000; whateverView.setId(currentId++);
- Это увеличивает идентификатор каждый раз, когдаcurrentId++
используется, обеспечивая уникальный идентификатор, и я могу сохранить Идентификаторы в моем ArrayList для последующего доступа.<resources>
.Также вы можете определить
ids.xml
вres/values
. Точный пример вы можете увидеть в примере кода Android.источник
Начиная с API 17,
View
класс имеет статический метод,generateViewId()
который будетисточник
Это работает для меня:
источник
findViewById()
это медленная операция. Подход работает, но за счет производительности.(Это был комментарий к ответу дилетанта, но он стал слишком длинным ... хе-хе)
Конечно, статика здесь не нужна. Вы можете использовать SharedPreferences для сохранения вместо статического. В любом случае, причина заключается в том, чтобы сохранить текущий прогресс, чтобы он не был слишком медленным для сложных макетов. Потому что, на самом деле, после его использования один раз, это будет довольно быстро позже. Тем не менее, я не думаю, что это хороший способ сделать это, потому что если вам придется перестраивать свой экран снова (скажем,
onCreate
снова вызывается ), то вы, вероятно, все равно захотите начать все сначала, исключая необходимость использования статического электричества. Поэтому просто сделайте его переменной экземпляра вместо статической.Вот уменьшенная версия, которая работает немного быстрее и может быть легче для чтения:
Эта функция должна быть достаточной. Потому что, насколько я могу судить, сгенерированные Android идентификаторы исчисляются миллиардами, так что это, вероятно, вернется
1
в первый раз и всегда будет довольно быстрым. Потому что на самом деле он не будет проходить мимо используемых идентификаторов, чтобы найти неиспользуемый. Однако, цикл является там действительно должно найти подержанный ID.Однако, если вы все еще хотите сохранить прогресс между последующими воссозданиями вашего приложения и хотите избежать использования статического. Вот версия SharedPreferences:
Этот ответ на аналогичный вопрос должен рассказать вам все, что вам нужно знать об идентификаторах с Android: https://stackoverflow.com/a/13241629/693927
РЕДАКТИРОВАТЬ / ИСПРАВИТЬ: Просто понял, что я полностью облажался. Должно быть, я был пьян.
источник
Библиотека Compat теперь также поддерживает
generateViewId()
метод уровней API до 17.Просто убедитесь, что вы используете версию
Compat
библиотеки, которая27.1.0+
Например, в вашем
build.gradle
файле введите :implementation 'com.android.support:appcompat-v7:27.1.1
Тогда вы можете просто использовать класс
generateViewId()
fromViewCompat
вместоView
класса следующим образом://Will assign a unique ID myView.id = ViewCompat.generateViewId()
Удачного кодирования!
источник
Просто дополнение к ответу @phantomlimb,
в то время как
View.generateViewId()
требуется уровень API> = 17,этот инструмент совместим со всеми API.
в соответствии с текущим уровнем API,
он решает погоду, используя системный API или нет.
так что вы можете использовать
ViewIdGenerator.generateViewId()
иView.generateViewId()
в то же время и не беспокоиться о получении того же идентификатораисточник
for (;;) { … }
из исходного кода Android.generateViewId()
else { return View.generateViewId(); }
это будет бесконечный цикл для уровня API меньше 17 устройств?Для динамической генерации API формы View Id используйте 17
generateViewId ()
Который будет генерировать значение, пригодное для использования в
setId(int)
. Это значение не будет конфликтовать со значениями идентификатора, сгенерированными во время сборки aapt дляR.id
.источник
...
источник
Я использую:
Используя случайное число, у меня всегда есть огромный шанс получить уникальный идентификатор с первой попытки.
источник
источник
Мой выбор:
источник