Почему я не получаю сообщение об ошибке, когда ссылаюсь на идентификатор, который не был помечен как "@ + id"? - PullRequest
0 голосов
/ 11 декабря 2018

Я ссылаюсь на @ id / action_profile перед тем, как назначить @ + id / action_profile.Почему это не дает мне ошибку?Это потому, что идентификаторы назначены в R.java, а атрибуты - во время выполнения?

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/action_profile"/>

    <LinearLayout
        android:id="@+id/action_profile"
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true">

        <ImageView android:id="@+id/profile_icon"
            android:layout_height="25dp"
            android:layout_width="25dp"/>

        <TextView android:id="@+id/profile_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>

</RelativeLayout>

1 Ответ

0 голосов
/ 11 декабря 2018

Чтобы поговорить об этой теме, нам необходимо иметь твердое основание для понимания того, что на самом деле делают атрибуты 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, и тогда мой первый макет очень рад его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...