在“相对布局”中定位“@id”与“@ + id”

美好的一天,我有一个相对布局的小问题,我不知道为什么。 通常情况下,当您尝试相对于其他视图进行定位时,可以使用“@id”,但似乎根本没有定位。 只有当我使用值“@ + ID”会正确的。 在下面的例子中,我有4个视图在水平方向我希望TextView与“percentage_id”被定位在图像之间,但更接近最后一个。

<RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/sales_id" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginLeft="10dp" android:text="£0.00" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="#AADDEE" android:textSize="18sp" android:textStyle="bold" > </TextView> <ImageView android:id="@+id/arrow_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_toRightOf="@id/sales_id" android:baselineAlignBottom="true" android:src="@drawable/rightarrow" > </ImageView> <TextView android:id="@+id/percentage_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/imagearrow_id" android:layout_toRightOf="@id/arrow_id" android:text="0.00%" android:textColor="#606090" android:textSize="18sp" > </TextView> <ImageView android:id="@+id/imagearrow_id" android:layout_width="20dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginLeft="2dp" android:layout_weight="0" android:gravity="right" android:padding="5dp" android:src="@drawable/rightarrow" > </ImageView> </RelativeLayout> 

现在无论我做什么,它只是在相对布局中的默认位置,只有当我使用“@ + ID”而不是“@ID”它是否到正确的位置。 我知道有时它可以给错误,如果视图试图引用尚未声明,但即使我把文本视图最后,我仍然无法得到它,直到我使用“@ + ID”。

这是一个新的东西,也适用于相对布局? 因为我不知道为什么它不使用“@id”。 我很好吗? 任何人遇到同样的问题? 在网上看到一些教程使用“@ + ID”也定位。 谢谢

Solutions Collecting From Web of "在“相对布局”中定位“@id”与“@ + id”"

尽pipe您可以引用层次结构中稍后声明的视图,但仍然按顺序分析XML文档。 您第一次引用特定的ID时, 必须@+id为前缀。 实际上,你可以用@+id来标识每一个ID的引用,并且所有的东西都可以工作 – 事实上,如果你使用graphics编辑器来devise你的接口,会发生什么。 为了安全起见,所有内容都以@+id作为前缀。 +只是告诉它在R.java生成一个ID,当且仅当它还没有被定义。 如果您尝试多次定义它,则只会看到它已被定义并继续正常运行。

在你的XML中,你从你的percentage_id TextView引用imagearrow_id 。 但是,此时imagearrow_id尚未定义。 对于这种情况,您可以简单地在您的TextView中添加layout_toLeftOf=@+id/imagearrow_id ,然后在下面定义ImageView( imagearrow_id )时,不需要android:id属性中的+

第一次声明ID时使用@+id ,不应该在元素的定位中使用它。 它只能用于android:id属性。

另一方面@id用于引用现有的ID。

RelativeLayout ,不能在当前代码的引用视图下面引用视图。 所以如果你有以下布局:

 LayoutRoot View1 View2 View3 

View1不能,或者说不应该使用View2和View3来定义它的位置。 View2应该只使用View1来定义它的位置,而View3可以使用View1和View2。

基本上,只要通过它引用的视图已经在布局文件的引用视图之上声明,就可以使用@id

因此,简单地切换代码块的最后两个小部件的位置应允许您使用@id

 <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/sales_id" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginLeft="10dp" android:text="£0.00" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="#AADDEE" android:textSize="18sp" android:textStyle="bold" > </TextView> <ImageView android:id="@+id/arrow_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_toRightOf="@id/sales_id" android:baselineAlignBottom="true" android:src="@drawable/rightarrow" > </ImageView> <ImageView android:id="@+id/imagearrow_id" android:layout_width="20dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginLeft="2dp" android:layout_weight="0" android:gravity="right" android:padding="5dp" android:src="@drawable/rightarrow" > </ImageView> <TextView android:id="@+id/percentage_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/imagearrow_id" android:layout_toRightOf="@id/arrow_id" android:text="0.00%" android:textColor="#606090" android:textSize="18sp" > </TextView> </RelativeLayout>