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

Механизм столкновения Android id для R.java

Мы все знаем, что при создании id для Android с помощью

@+id/foo

Android создает для нас запись в R.java как:

 public static final class id {
        public static final int foo=0x7f060005;
 }

Что произойдет, если есть столкновение имен в разных xml файлах (скажем, внутри двух макетов)? Механизм @+ id позволяет нам переписать имя идентификатора, если еще один существует, но какой из них генерируется в R.java для нас?

4b9b3361

Ответ 1

Синтаксис @+id/foo добавит, если идентификатор не существует или использует существующий идентификатор.
Когда вы находитеПрибор, он будет работать в представлении, на котором вы вызываете метод.

Итак, если у вас есть вложенные представления, ваш идентификатор будет уникальным для каждого представления. например View1 → View2 имеют foo. View1.findViewById(R.id.foo) будет отличаться от View2.findViewById(R.id.foo)

edit: Я думаю, самое главное, что два макета не могут иметь один и тот же идентификатор. Для получения дополнительной информации об ограничении id: http://d.android.com/guide/topics/ui/declaring-layout.html

Ответ 2

Я попробовал простое приложение Hello World со следующим xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

<TextView
        android:id="@+id/textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="text1"
/>

<TextView
        android:id="@+id/textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="text2"
/>

</LinearLayout>

Оба моих текста имеют одинаковый идентификатор. Он компилируется отлично, отлично работает, отображает как TextViews, так и когда я нахожу findViewByid(), первый находит, и к нему применяются все мои вызовы функций, такие как setText. В идеале AAPT должен поймать это, но, по-видимому, это не так. Это не будет ломать что-то ужасно, если программист не опирается на идентификаторы. Так что вроде как сказать: если вы достаточно глупы, чтобы написать такой код, то вы заслуживаете краха.

AAPT не будет беспокоиться об этом. Для него это похоже на простое расширение представлений без явных идентификаторов, предоставляемых программистом.

Ответ 3

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