Механизм столкновения Android ID для R.java - PullRequest
16 голосов
/ 21 января 2010

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

@+id/foo

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

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

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

Ответы [ 3 ]

25 голосов
/ 21 января 2010

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

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

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

4 голосов
/ 23 января 2012

Я попробовал простое приложение 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 не слишком заботится об этом. Для него это похоже на простое расширение Views без явных идентификаторов, предоставляемых программистом.

2 голосов
/ 21 января 2010

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

...