19

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

<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”进行定位。谢谢

4

3 回答 3

31

尽管您可以引用层次结构中稍后声明的视图,但仍按顺序解析 XML 文档。第一次引用特定 ID 时,必须在其前面加上@+id. 实际上,您可以在每个对 ID 的引用前加上前缀@+id,一切都会正常工作——事实上,如果您使用图形编辑器设计界面,就会发生这种情况。为了安全起见,所有内容都以@+id. 只是告诉它在当且仅当它尚未被定义时才+生成一个 ID 。R.java如果您尝试多次定义它,它只会看到它已经被定义并正常继续。

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

于 2012-10-09T17:31:48.400 回答
3

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

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

在 aRelativeLayout中,您不能引用当前代码中引用视图下方的视图。因此,如果您有以下布局:

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>
于 2012-10-09T17:25:24.940 回答
0

在尝试了 ConstraintLayout 之后,检查下面的代码片段,两个视图都包含在 constraintLayout 中,我将粘贴案例代码:

<android.support.v4.widget.ContentLoadingProgressBar
            android:id="@+id/progress"
            android:layout_width="150dp"
            android:layout_height="150dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintVertical_bias="0.3"
            style="?android:attr/progressBarStyleLarge"
            android:visibility="@{safeUnbox(viewmodel.isLoading) ? View.VISIBLE : View.INVISIBLE}"
            />

        <TextView
            android:id="@+id/click_load"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:gravity="center_horizontal"
            android:text="@{viewmodel.text}"
            android:textSize="22sp"
            android:visibility="@{safeUnbox(viewmodel.isLoading) ? View.INVISIBLE : View.VISIBLE}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/progress"
            tools:text="ojoooihoihohoihiohhoihio" />

该行:

 app:layout_constraintTop_toBottomOf="@id/progress"

在编辑器中显示固定到视图窗口顶部的文本视图,运行时一切看起来都很好,但这仍然令人困惑,现在如果你这样写

 app:layout_constraintTop_toBottomOf="@+id/progress"

按预期在 UI 编辑器的进度下方显示 textview,通读 kcoppock 解释我发现它与案例相符。

于 2018-07-16T09:02:12.607 回答