在分配@ + 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>
答案 0 :(得分:1)
为了讨论此主题,我们需要具有扎实的基础,以了解android:id
和android: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
,然后我的第一个布局很高兴使用它。