这个documentation总是让我感到困惑:
对于ID值,通常应使用以下语法形式: “ @ + id /名称”。加号+表示这是一个新资源 ID和aapt工具将在R.java中创建一个新的资源整数 类(如果尚不存在)。例如:
<TextView android:id="@+id/nameTextbox"/>
我已经编程了一段时间了。但是,我从未遇到过必须使用不带加号的ID声明的情况。这也是违反直觉的。 ID应该是唯一的!
有什么好的用例吗?为什么要重用相同的资源ID名称?
答案 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 Android和What 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>