Чтобы поговорить об этой теме, нам необходимо иметь твердое основание для понимания того, что на самом деле делают атрибуты android:id
и android:layout_toLeftOf
(и любой другой атрибут, который ожидает ресурс id).
Они устанавливают только поля int
в своих View
(или объекте LayoutParams
своего представления).
Эти поля int
могут затем использоваться для определения поведения, но доЭто касается тега <TextView>
, все, что означает android:layout_toLeftOf="@id/action_profile"
, это "store R.id.action_profile
как идентификатор представления, которое я должен расположить слева от".В текстовом файле нет нисходящего анализа, чтобы определить, был ли ранее объявлен тег представления с таким идентификатором.TextView просто сохраняет int
на потом.
На самом деле, если довести его до крайности, совершенно законно следующее:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/some_other_id"
android:text="hello world"/>
</RelativeLayout>
В этом макете нет ничего с идентификаторомsome_other_id
, так как мой TextView может быть ниже этого?Что ж, если вы запустите это приложение, оно просто расположится в верхнем левом углу, потому что не может найти представление, на которое я ссылался.
Причина, по которой компилируется , заключается в том, что яв моем проекте другой файл макета:
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/some_other_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="I'm hiding!"/>
Этот файл макета не используется в моей деятельности.Это никак не связано с первым примером.Но все, что имеет значение, это то, что в нем есть @+id/some_other_id
.Это приводит к созданию R.id.some_other_id
, и тогда мой первый макет очень рад его использовать.