Подтвердить что ты не робот

Идентификатор Android View должен быть уникальным?

Хорошо, поэтому я смущен тем, что Android-идентификаторы должны быть уникальными или нет. Вот почему возникает путаница:
Скажем, есть Activity, который имеет TextView (android: id = "text" ) и Button (android: id = "button"). Button устанавливает текст текстового представления в случайный текст. Итак, чтобы добавить слушателя, я заберу кнопку, как и Button b = (Button) findViewById(R.id.button), а затем добавьте слушателя для выполнения задачи.
Теперь я могу ссылаться на этот тот же TextView от DialogFragment, a Fragment и то, что не с тем же id R.id.text, и все изменения будут когда-либо применены к этому текстовому виду без сомнения,

В случае подкласса BaseAdapter вам необходимо переопределить getView, где вы делаете раздувание, если это необходимо, а если нет, вы вносите изменения. Теперь вы получите Views почти таким же образом. Почти.
Вы делаете convertView.findViewById(..).

Если все представления должны иметь уникальный идентификатор, как изменение содержимого View в getView не приводит к хаотичному поведению?
Я имею в виду, что все просмотренные представления имеют тот же идентификатор, что и в макете.

Я понимаю, что идентификаторы уникальны в контексте представления, которое их накачивало. Поскольку я новичок, я прошу разъяснений

Обновление после ответа Ахмада

Итак, это означает, что я не могу раздуть два Fragment в Activity, используя тот же макет. Это приведет к исключению. Оба завышены тем же самым Activity, поэтому принадлежат к одному и тому же экземпляру. Идентификаторы конфликтуют

4b9b3361

Ответ 1

В документация Вы можете прочитать

Идентификатор не должен быть уникальным по всему дереву, , но он должен быть уникальным в той части дерева, которое вы ищете (часто это может быть все дерево, поэтому лучше всего быть полностью уникальным, когда это возможно).

Это означает, что исключений не будет, если вы используете одинаковый идентификатор для всех своих просмотров, но, очевидно, макет будет бесполезен.

FindViewById работает просто путем перемещения дерева до тех пор, пока не найдет первый элемент с искомым идентификатором и не вернет его (или null, если не найдет). Если у вас было несколько элементов с одним и тем же идентификатором в дереве, вы всегда получите тот же самый элемент, который является первым в дереве.

У вас может быть много фрагментов, завышенных с одинаковой компоновкой, так же, как у вас есть ListView, причем каждый элемент имеет тот же макет, потому что надуватель не заботится о значениях id. Он просто читает XML файл и больше не создает дерево с правильными объектами представления.

Ответ 2

Вы делаете convertView.findViewById(..).

Если все представления должны иметь уникальный идентификатор, как изменяется содержимое View в getView не приводит к хаотичному поведению?

Это потому, что вы создаете экземпляр представления, раздувая его. В этом случае идентификаторы должны быть уникальными. В противном случае вы, вероятно, получите ClassCastException (Если два разных типа представления имеют один и тот же идентификатор).

Невозможно поддерживать ListView, где каждая строка должна иметь уникальные идентификаторы для всех своих представлений.

Итак, что это значит, я не могу раздуть два фрагмента в активности используя тот же макет. Это приведет к исключению. Оба завышенные одной и той же Деятельностью, следовательно, принадлежат к одному и тому же экземпляру. ids будет conflic

Нет, фрагменты работают по-другому. Вы должны вернуть завышенный вид в методе фрагментов onCreateView(). Поэтому каждый фрагмент должен раздувать представление, что приводит к наличию двух отдельных объектов вида.

Ответ 3

Почему вы используете android:id="text"? Вы должны использовать android:id="@+id/text" или android:id="@id/text" в зависимости от того, каким образом вы выберете. Кроме того, getView относится к позиции позиции при прокрутке или нет ListView