这个documentation总是让我感到困惑:


<TextView android:id="@+id/nameTextbox"/>

我已经编程了一段时间了。但是,我从未遇到过必须使用不带加号的ID声明的情况。这也是违反直觉的。 ID应该是唯一的!

有什么好的用例吗?为什么要重复使用相同的资源ID名称?

最佳答案

首先

当我们第一次(从上到下)在特定xml文件中引用ID时,而不是在首次创建ID时,我们使用 +

<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
  <Button
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/another_button"
    android:layout_alignParentTop="true"
    android:text="@string/button" />
  <Button
    android:id="@id/another_button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:text="@string/another_button" />
 </RelativeLayout>

其次是

当某人正在使用 RelativeLayout ConstraintLayout 即某些相对父 View 时,他们需要多次使用相同的 id 来定义 Activity 或 Activity 中的某些 View 等。

第三,

加号(+)表示这是一个新的资源名称,必须创建该资源并将其添加到我们的资源中(在R.java文件中)。
因此,每次我们使用@ + id/some_id时,它都会触发针对同一 View 的新资源引用的创建,即冗余。

示例(用于第二个用例)
<RelativeLayout
    android:id="@+id/final_order_activity_order_rl"
    android:layout_margin="5dp"
    android:background="@drawable/gradient_for_btns"
    android:paddingBottom="8dp"
    android:paddingTop="8dp"
    android:paddingStart="4dp"
    android:paddingEnd="4dp"
    android:layout_alignParentBottom="true"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:layout_centerInParent="true"
        android:layout_marginStart="8dp"
        android:textStyle="bold"
        android:textSize="18dp"
        android:text="$2000"
        android:textColor="@android:color/white"
        android:maxLines="1"
        android:layout_toLeftOf="@+id/final_order_activity_place_order_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/final_order_activity_total_tv" />

    <Button
        android:paddingStart="6dp"
        android:paddingEnd="6dp"
        android:layout_marginEnd="8dp"
        android:text="Place Order"
        android:background="@drawable/ripple_effect"
        android:textColor="@color/baseColorBright"
        android:layout_alignParentEnd="true"
        android:layout_width="wrap_content"
        android:layout_height="28dp"
        android:id="@id/final_order_activity_place_order_btn"/>

</RelativeLayout>

10-06 14:03
查看更多