2011-04-20 33 views
18

可能重复:
What is different between @+id/android:list and @id/android:list ??Android中的@ id /和@ + id /有什么区别?

是什么@id/..and @+id/..之间的区别?我不是指差异 @android:id/..@id/..代码示例之间

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

是什么上述两个id定义之间的区别?

+3

加号似乎表明ID已添加,并且缺席似乎表示该ID已存在。我只是在实践中看到了这一点,但没有注意到它的必要性......所以...我也想知道更多。 – 2011-04-20 13:51:53

+0

@George Bailey这是一个答案 – Selvin 2011-04-20 13:54:10

+1

@ + George;)我也想知道。它们基本上可以互换吗?我一直只用@ + id。顺便说一句,“Id已经存在”是你的意思是一个资源ID?这就说得通了。 – wired00 2011-04-20 13:54:15

回答

39

必须在XML文件中使用@+符号上的ID的第一次出现。第二次和以后的时间,你可以 - 也应该 - - 丢弃+标志。这将有助于发现错别字。例如,假设您有RelativeLayout。您在RelativeLayout中有TextView,其android:id@+id/label。稍后在布局XML文件中,您希望从另一个参考TextView进行定位(例如,针对android:layout_below)。

如果您在android:layout_below="@+id/labbel"(注意错字)中键入,在编译时,这将被视为确定。然而,在运行时,事情将无法正常工作,从小部件被错误定位到彻底崩溃,取决于Android版本。

如果您在android:layout_below="@id/labbel"输入(注意错字失踪+标志),那么你会得到一个编译错误。


UPDATE

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

<?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,则在编译时失败”。

+0

+1你的答案好多了。 – MByD 2011-04-20 14:03:12

+0

你的意思是,当我第一次创建按钮时,我应该使用加号,并在我第一次编译后,我应该删除这个加号? 我有你的想法,当我在另一个地方像android调用按钮:layout_toRightOf =“@ id/add_button”我不得不删除加号 但在这里我谈论的标签中的按钮声明 我的意思是如果我要去我的XML文件中创建一个按钮是什么bettwen区别 <按钮 机器人:ID = “@ ID/ADD_BUTTON” /> <按钮 机器人:ID = “@ + ID/ADD_BUTTON” /> 对不起,打扰你:) – hazem 2011-04-20 14:13:23

+1

他意味着当你创建按钮并为其分配一个ID时,使用'+'符号,但是当你引用这个按钮时(例如,位置,例如'android:layout_below' )你不应该使用'+'符号。 – MByD 2011-04-20 14:18:04

3

Android Guide

对于ID值,你通常应该使用 这句法形式: “@ + ID /名称”。 加上符号+,表示这是 一个新的资源ID,并且aapt工具 将在 R.java类中创建一个新的资源整数,如果它不存在 。

所以+是用于分配一个新的ID,它也将工作时使用存在的ID,但它不是必要的。

+0

不幸的是,这是文档中较弱的地方之一,并不是特别准确。 – CommonsWare 2011-04-20 13:59:30

3

第二个:

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

定义了一个新的ID。当你想引用布局元素时,你会使用第一个。例如,在一个相对布局:

android:layout_below="@id/remove_button" 
6

在Android布局资源XML源文件:

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

"@id/anyId":指现有的ID

应使用"@id/anyId"只有当 “anyId” 已添加到R.java类使用"@+id/anyId"

相关问题