没有加号的新资源ID声明

时间:2018-06-21 06:14:04

标签: android android-resources

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

  

对于ID值,通常应使用以下语法形式:   “ @ + id /名称”。加号+表示这是一个新资源   ID和aapt工具将在R.java中创建一个新的资源整数   类(如果尚不存在)。例如:

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

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

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

4 个答案:

答案 0 :(得分:7)

@ + id /名称:创建new id

“ @ id /” ,当您link to existing id

用例1:

假设您以XML创建了自己的资源:

<resources>
    <item name="plusIcon" type="id"/>
</resources>

现在,您可以在多个位置使用此资源,而无需使用 @ + id 创建新资源。说layout_one.xml

<TextView android:id="@id/plusIcon"/>

layout_two.xml中的资源相同:

<TextView android:id="@id/plusIcon"/>

用例2:

Android框架提供了许多其他ID资源。在这种情况下,如果您要引用Android资源ID,则可以使用@android,而无需创建自己的新资源ID

答案 1 :(得分:5)

这意味着您是否已在

之类的layout_one.xml中声明了视图
<TextView
    android:text="Sample Text"
    android:id="@+id/text_view_sample"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

如果您有类似layout_two.xml的textView,例如

<TextView
    android:text="Sample Text2"
    android:id="@+id/text_view_sample"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

在两种情况下,都只会在R.java中创建一个ID,并且将其重新使用到另一个xml中(以后将被调用)。

您可以在这里住在一起(在layout_two.xml中)

<TextView
        android:text="Sample Text2"
        android:id="@id/text_view_sample"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

此处,Android将重复使用layout_one.xml之前创建的ID。

您还应该阅读Difference between "@id/" and "@+id/" in AndroidWhat is the difference between @id and @+id?

答案 2 :(得分:3)

RelativeLayout 中定义约束可能是一个很好的例子。

<?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">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="Top"/>

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="Bottom"/>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/textView3"
        android:layout_below="@id/textView1"
        android:text="Center"/>

</RelativeLayout>

在最后一个TextView上, android:layout_above android:layout_below 不需要加号,因为textView1和textView2已经定义了ID。

答案 3 :(得分:2)

首先

当我们第一次(从上到下)在一个特定的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 时,即某些 相对父视图 ,他们需要使用相同的<多次点击strong> id 以定义活动或活动中的某些视图等。

第三

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

示例(用于第二个用例)

<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>