#java #android
#java #Android
Вопрос:
У меня есть несколько макетов, использующих один и тот же идентификатор кнопки, который в данном случае равен @ id/button1, во время выполнения я раздуваю макеты и извлекаю каждую кнопку по отдельности из их заданных представлений. Первая кнопка захватывается просто отлично, но все последующие кнопки с тем же заданным идентификатором не могут быть найдены с помощью findViewById (вызывается из собственного представления, а не действия).
Проверка кнопки в отладчике показывает, что последующие кнопки имеют почти тот же тег ID, но увеличенный на 1. Кажется, Android не учитывает идентификаторы, указанные в файле XML, если уже существует экземпляр идентификатора .. Так ли это? Если да, то как можно связать кнопки между представлениями, нужно ли нам присваивать каждому виджету глобально уникальный идентификатор?
Комментарии:
1. Я не знаю, что произошло, но удаление макета и его повторное восстановление, похоже, решили проблему. Хотя первоначальная проблема была реальной, я много раз проходил через отладчик. Что-то происходит с ресурсами и тем, как они компилируются для проектов Android, что приводит к несоответствию идентификаторов виджетов между файлом XML и развернутыми ресурсами.
Ответ №1:
Каждый виджет, который одновременно существует в одной и той же иерархии представлений, должен иметь уникальное значение ID. Другими словами, вы можете повторно @ id/button1
использовать его в своих макетах приложений, но раздувание нескольких представлений в одну и ту же иерархию с одним и тем же идентификатором может вызвать двусмысленность.
Это в некоторой степени зависит от того, как построены ваши фактические макеты, но еще одна вещь, которую вы можете сделать, чтобы разрешить некоторую двусмысленность, — это вызвать findViewById() из другого представления, расположенного ниже по иерархии. Например, я могу создать единый макет следующим образом:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@ id/row_one"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row One"/>
<Button
android:id="@ id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@ id/row_two"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row Two"/>
<Button
android:id="@ id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@ id/row_three"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row Three"/>
<Button
android:id="@ id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
Обратите внимание, что все кнопки имеют одинаковое значение ID. Чтобы получить ссылки на эти кнопки, я не могу просто позвонить findViewById()
из своей деятельности…какой из них я получу?? Однако findViewById()
его можно вызвать из любого представления, поэтому я могу сделать следующее, чтобы получить ссылки на каждую кнопку:
setContentView(R.layout.main);
Button one = (Button)findViewById(R.id.row_one).findViewById(R.id.button);
Button two = (Button)findViewById(R.id.row_two).findViewById(R.id.button);
Button three = (Button)findViewById(R.id.row_three).findViewById(R.id.button);
И теперь у меня есть ссылка на каждую уникальную кнопку, даже если у них одинаковый идентификатор. Сказав это, я все еще не сторонник этого, если ваше приложение соответствует примеру. Создание уникальных ссылок на ID также помогает сохранить код читаемым.
HTH!
Комментарии:
1. Благодаря Devunwired, я вызываю findViewById() для каждого просмотра или действия. Я управляю своими представлениями вручную и выполняю пользовательский переход между ними, поэтому при запуске я раздуваю и привязываю кнопки. Вот почему было так непонятно, почему Android не уважает идентификаторы, поскольку это важная часть моей схемы (я бы предпочел не называть каждую кнопку уникальным именем для всего проекта).
Ответ №2:
В конце концов, каждая кнопка получает свой собственный static final int
, который мы можем назвать уникальным идентификатором, верно?
Да, вы должны присвоить каждой кнопке свой собственный идентификатор… И вы не должны называть кнопки button1
button2
и так далее.