【问题标题】:what is the difference betwenn @id/ and @+id/ in android? [duplicate]android中@id/和@+id/有什么区别? [复制]
【发布时间】:2011-04-20 13:49:08
【问题描述】:

可能重复:
What is different between @+id/android:list and @id/android:list ??

@id/..and @+id/.. 和有什么区别?我不是指之间的区别 @android:id/..@id/..

代码示例:

<Button
android:id ="@id/add_button"
/>
<Button
android:id ="@+id/remove_button"
/>

上面的两个id 定义有什么区别?

【问题讨论】:

  • 加号好像是加了id,没有好像表示id已经存在。我只是在实践中看到了这一点,但没有注意到它的必要性......所以......我也想了解更多。
  • @George Bailey 这是一个答案
  • @+George ;) 我也想知道。它们基本上可以互换吗?我一直只使用@+id。顺便说一句,“Id 已经存在”是指资源 id 吗?这是有道理的。

标签: android


【解决方案1】:

您必须在 XML 文件中 ID 的第一次出现处使用 @+ 表示法。第二次和以后的时间你可以——而且应该——放弃+ 标志。这将有助于发现拼写错误。

例如,假设您有一个RelativeLayout。你有一个TextView 在那个RelativeLayout 中,它的android:id@+id/label。稍后在布局 XML 文件中,您希望从另一个文件中引用 TextView 以进行定位(例如,android:layout_below)。

如果您在编译时输入android:layout_below="@+id/labbel"(注意错字),这将被认为是可以的。但是,在运行时,事情将无法正常工作,从小部件定位不正确到彻底崩溃,具体取决于 Android 版本。

如果您输入了android:layout_below="@id/labbel"(注意错字缺少的+ 符号),那么您会收到编译错误。


更新

由于第一次不够清楚,显然,让我们再试一次。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="URL:"
        android:layout_alignBaseline="@+id/entry"
        android:layout_alignParentLeft="true"/>
    <EditText
        android:id="@id/entry"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/label"
        android:layout_alignParentTop="true"/>
    <Button
        android:id="@+id/ok"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/entry"
        android:layout_alignRight="@id/entry"
        android:text="OK" />
    <Button
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/ok"
        android:layout_alignTop="@id/ok"
        android:text="Cancel" />
</RelativeLayout>

在上方,您将看到RelativeLayout。您会注意到每个 ID 的第一次出现都带有 + 符号。每个 ID 的第二次和后续出现不会获得 + 符号。

您可以在所有这些上使用+ 符号,但是如果您打错字,编译器将不会发现问题。

+ 符号有效地表明“分配一个新 ID”。没有+ 符号表示“使用以前分配的 ID,如果没有这样的 ID,则在编译时失败”。

【讨论】:

  • +1 你的回答好多了。
  • 你的意思是当我第一次创建按钮时我应该使用加号并且在我第一次编译后我应该删除这个加号?我知道当我在另一个地方(如 android:layout_toRightOf="@id/add_button" 调用按钮时)我必须删除加号但这里我在谈论其标签中的按钮声明我的意思是如果我要在我的 xml 文件中创建一个按钮 bettwen 有什么区别 抱歉打扰你了 :)
  • 他的意思是当你创建按钮并为其分配一个ID时,使用+符号,但是当你引用这个按钮时(例如在位置,例如android:layout_below)你应该不要使用+ 符号。
  • @hazem:查看我的答案的更新。
【解决方案2】:

在Android布局资源XML源文件中:

"@+id/anyId" : 添加新的id

"@id/anyId" : 引用现有 id

只有在使用"@+id/anyId" 将“anyId”添加到R.java 类时,您才应该使用"@id/anyId"

【讨论】:

    【解决方案3】:

    来自Android Guide

    对于 ID 值,您通常应该 使用这种语法形式:“@+id/name”。这 加号 + 表示这是 新的资源 ID 和 aapt 工具 将创建一个新的资源整数 R.java 类,如果没有 已经存在了。

    所以+ 是用来分配一个新的id,它也可以在使用现有的id 时工作,但在那里没有必要。

    【讨论】:

    • 不幸的是,这是文档中的薄弱环节之一,并不是特别准确。
    【解决方案4】:

    第二个:

    <Button android:id ="@+id/remove_button" />
    

    定义一个新的ID。当您想要引用布局元素时,您将使用第一个。例如,在相对布局中:

    android:layout_below="@id/remove_button"
    

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多