当我引用未用“ @ + id”标记的ID时,为什么没有出现错误?

时间:2018-12-11 20:31:04

标签: android xml android-layout

在分配@ + id / action_profile之前,我先引用@ id / action_profile。为什么这不给我一个错误?是因为ID是在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 :(得分:1)

为了讨论此主题,我们需要具有扎实的基础,以了解android:idandroid:layout_toLeftOf属性(以及任何其他需要id资源的属性)实际上是做什么的

他们仅在int(或其视图的View对象)上设置LayoutParams字段。

随后可以使用这些int字段指定行为,但是就<TextView>标记而言,android:layout_toLeftOf="@id/action_profile"的意思是将“ R.id.action_profile存储为我应该将自己定位在视图的ID“的左侧。没有文本文件的自上而下的解析,以查找先前是否已经声明了具有该ID的视图标签。 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>

此布局中没有ID为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,然后我的第一个布局很高兴使用它。