Как я могу назначить идентификатор для представления программно?
в XML-файле мы можем назначить идентификатор для представления типа android:id="@+id/something" а потом позвоните findViewById(), но при создании представления программно, как я могу присвоить ID?
Я думаю setId() не совпадает по умолчанию. setId() дополнительно.
может кто-нибудь меня поправит?
3 ответов:
Android
idобзорАндроид
id- это целое число, обычно используемое для идентификации представлений; thisidможет быть назначен через XML (когда это возможно) и с помощью кода (программно.) Вidнаиболее полезно для получения ссылок на XML-определенныеViews генерируетсяInflater(например, с помощьюsetContentView.)присвоить
idчерезXML
- добавить атрибут
android:id="@+id/somename"в свой вид.- когда ваше приложение построено, то
android:idназначается уникальныйintдля использования в коде.- ссылка
android:id' sintзначение в коде с помощью "R.id.somename "(фактически константа.)- этой
intможет меняться от сборки к сборке так никогда не копируйте id отgen/package.name/R.java, Просто используйте "R.id.somename".- (также, an
idназначенные кPreferenceв XML не используется, когдаPreferenceпорождаетView.)присвоить
idчерез код (программно)
- установить вручную
idС помощьюsomeView.setId(int);- The
intдолжен быть положительным, но в остальном произвольным - это может быть все, что вы хотите (продолжайте читать, если это страшно.)- например, при создании и нумерации нескольких представлений, представляющих элементы, можно использовать их элемент число.
уникальность
ids
XMLназначенids будет уникальным.- код, присвоенный
idС не должны быть уникальными- код, присвоенный
ids может (теоретически) конфликтовать сXMLназначенids.- эти противоречивые
ids не будет иметь значения, если запрос правильно (продолжайте читать).когда (и почему) конфликтующие
ids не имеет значения
findViewById(int)будет повторять глубину-сначала рекурсивно через иерархию представлений из вида, который вы указываете и вернуть первыйViewон находит с соответствующимid.- пока нет присвоенного кода
ids назначается перед XML-определеннымidв иерархии,findViewById(R.id.somename)всегда будет возвращать XML-определенное представление soid' d.динамическое создание представлений и Назначение
IDs
- в макете XML, определить пустой
ViewGroupсid.- например,
LinearLayoutсandroid:id="@+id/placeholder".- используйте код для заполнения заполнителя
ViewGroupсViews.- если вам нужно или хотите, назначьте любой
ids, которые удобны для каждого вида.запрос этих дочерних представлений с помощью заполнителя.findViewById(convenientInt);
API 17 представил
View.generateViewId()что позволяет генерировать уникальный идентификатор.если вы решили оставить ссылки на ваши взгляды вокруг!--86-->, обязательно создайте их с помощью
getApplicationContext()и обязательно установите для каждой ссылки значение null вonDestroy. Видимо утечка theActivity(висеть на нем после того, как он уничтожен) расточительно.. :)зарезервировать XML
android:idдля использования в кодеAPI 17 введен
View.generateViewId(), который генерирует уникальный идентификатор. (благодаря взять-шансы сделать изменения указывающих на это.)*если
ViewGroupне может быть определен через XML (или вы не хотите, чтобы это было) вы можете зарезервировать идентификатор через XML, чтобы он оставался уникальным:здесь значения/идентификаторы.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, даже если вы устанавливаете идентификатор строки, это преобразуется в целое число. Благодаря этому, вы можете использовать любое (положительное) целое число кViewsдобавить программно.По данным
Viewдокументацияидентификатор не должен быть уникальным в иерархии этого вида. Идентификатор должен быть положительным числом.
Так что вы можете использовать любой положительное целое число, но в этом случае есть может быть какие-то взгляды с эквивалентом личности. Если вы ищите какой-нибудь просмотр в иерархии вызов setTag с некоторыми ключевыми объектами может быть удобный.
кредиты ответ.
Да, вы можете позвонить
setId(value)в любом представлении с любым (положительным) целым значением, которое вам нравится, а затем найти его в Родительском контейнере с помощьюfindViewById(value). Обратите внимание, что это допустимо для вызоваsetId()С одинаковым значением для разных видов братьев и сестер, ноfindViewById()возвращает только первый.
Comments