在Android中键入@ + id时会发生什么?

时间:2014-08-20 19:47:42

标签: java android xml

Android XML中的许多标识符都需要@前置作为对XML中其他位置定义的值的引用。

例如

@drawable/transparent
@color/red
@string/hello_world

然而,id的语法不同是很奇怪的:

@+id/my_id

显然,对于其他标识符,我们正在引用可在其他地方定义的资源,而对于id,我们正在创建标识符。为什么@+的语法?我很好奇这个语法究竟意味着什么,除了@+id之外还有其他用途(是@+string还是@+color?)。

2 个答案:

答案 0 :(得分:3)

  

然而,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="wrap_content">

  <TextView
    android:id="@+id/label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/entry"
    android:layout_alignParentLeft="true"
    android:text="@string/url"/>

  <EditText
    android:id="@id/entry"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@id/label"
    android:inputType="text"/>

  <Button
    android:id="@+id/ok"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignRight="@id/entry"
    android:layout_below="@id/entry"
    android:text="@string/ok"/>

  <Button
    android:id="@+id/cancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@id/ok"
    android:layout_toLeftOf="@id/ok"
    android:text="@string/cancel"/>

</RelativeLayout>

我对labelentry标识符的第二次引用使用@id/,表示标识符应该已在文件的前面定义过。

回到拖放GUI构建器之前的日子,这有助于在编译时检测ID不匹配。例如,如果我输入@id/ernty而不是@id/entry,我会收到编译错误,因为文件中没有@+id/ernty

  

除了@ + id

之外还有其他用途

我不知道。

答案 1 :(得分:0)

&#39; @id /&#39; :表示my_id是id

&#39; @ + ID /...&# 39; :表示您创建新ID。

因此,当您在布局中定义视图的ID时,使用@+id/my_id,但是当您引用它时(例如在android:layout_below中),您使用@id/my_id