Android中“ @ id /”和“ @ + id /”之间的区别


456

@id/和之间的区别是什么@+id/

@+id/加号中+指示创建一个新的资源名称并将其添加到R.java文件中,但是那又如何@id/呢?从:的文档中,ID当引用Android资源时ID,不需要加号,但必须添加android包名称空间,如下所示:

android:id="@android:id/list"

但是在下面的图像中,Eclipse并未提出任何建议@android:id/

该图显示了对@ / id和@ + / id的建议

@id/@android:id/一样吗?


从android docs:(永远寻找这个,我一直在寻找一个不相关的问题) developer.android.com/guide/topics/resources/...
胡安·彭梵得

Answers:


351

您指的是Android resources,它们已经在Android系统中定义,并且@android:id/..在访问您在项目中定义/创建的资源时,您可以使用@id/..

更多信息

根据您在聊天室中所做的澄清,您说自己有这样的问题:

如果我们使用android:id="@id/layout_item_id"它不起作用。而是@+id/可以工作,那么这里有什么区别?那是我最初的问题。

好吧,这取决于上下文,当您使用的XML属性时android:id,您要指定一个新的ID,并指示解析器(或称其为builder)在中创建新条目R.java,因此您必须包括一个+标志。

在另一种情况下 android:layout_below="@id/myTextView",您指的是已经创建的ID,因此解析器将此链接到中已创建的ID R.java

再次获得更多信息

正如您在聊天中所说的那样,请注意,如果android:layout_below="@id/myTextView"ID myTextView是在使用元素的元素之后编写的,则该元素将无法识别。


142
关于“更多信息”:您可以使用定义位置,android:layout_below="@+id/myTextView"然后使用定义元素本身android:id="@id/myTextView"
caw 2012年

1
@MarcoW这极大地帮助了我。我在寻找解决此问题的方法时遇到了麻烦(或者更不用说制定正确的搜索条目了)。我想这可能值得一个问题+答案。
David Miler 2012年

谢谢!我遇到了同样的问题,并且文档中关于该主题的内容不多。但是很明显:我们在这里遇到的问题不是经常发生的问题
caw

7
我总是在android:id和android:layout_below上使用@ + id /,这是一个问题吗?
melanke 2014年

4
@melanke:+放进去layout_belowandroid:id很好,因为The '+' means to create the symbol if it doesn't already exist正如Tanmay Mandal在他的好答案(但被低估)中提到的那样。因此,也没有负面的运行时影响(尽管^^可能导致编译时间的增加很小)。
Levite 2015年

86

+号是将ID添加到资源ID列表的捷径。否则,您需要将它们放在这样的xml文件中

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>

1
@schwiz:以及如何在布局中使用它?
维卡斯·帕蒂达

7
假设您有我在答案中定义的资源文件,那么在布局中就可以拥有。<View android:id="@id/my_logo"/> 如果您没有上面定义的资源文件,那么您需要像做<View android:id="@+id/my_logo"/> 笔记那样做:您只需要做一次+ id因此,如果您在另一个布局文件中执行了<View android:id =“ + id / my_logo” />,则下次您在布局中使用相同的ID时无需添加'+'字符。
内森·史威文

@schwiz:很好,但是我们必须将文件放置在哪里,res/drawable/或者res/layout/res/values/,该文件的名称是什么?如果您对此有任何有用的链接,请在此处发布。
维卡斯·帕蒂达

1
这是您需要了解的有关资源的命名约定等所有信息。您可以将文件放在res / values /中,惯例是将其命名为id,但是您可以随意调用它。 developer.android.com/guide/topics/resources/...
弥敦道Schwermann

46

有时您会在布局文件中看到引用,例如:

<listview id="@+id/android:list">

<listview id="@android:id/list">

有什么不同?

..很高兴你问☺

@+id/foo表示您正在应用程序的名称空间中创建一个名为foo的ID。您可以使用来引用它@id/foo@android:id/foo表示您是指在android名称空间中定义的ID。

“ +”表示创建符号(如果尚不存在)。在引用android:符号时,您不需要它(也不应使用它),因为这些符号已由平台为您定义,并且您无论如何都无法在该命名空间中创建自己的符号。

该名称空间是框架的名称空间。例如,您需要使用@android:id/list该框架,因为它是框架希望找到的ID。(框架仅知道android名称空间中的ID。)

从此完全复制


6
哇!完成CTRL + C,然后完成CTRL + V。很高兴您也引用了原始帖子。是你的博客吗?
Aman Alam

如果我已经在Button类型的第一布局@ + id / mybutton中声明了,那么就不需要在if第二布局中创建if的新实例,就像@ id / mybutton一样。这样对吗 ?
Hiren Dabhi 2013年

39

简而言之

android:id="@+id/my_button"

+ id加号指示android在“资源”中添加或创建新的ID。

android:layout_below="@id/my_button"

它只是帮助引用已经生成的ID。


9

+仅当您首次定义资源ID时,才需要在资源类型之前加号()。编译应用程序时,SDK工具使用ID名称在R.java引用该EditText元素的项目文件中创建一个新的资源ID 。使用这种方式一次声明资源ID后,对该ID的其他引用就不需要加号了。仅当指定新的资源ID时才需要使用加号,而对于诸如字符串或布局之类的具体资源则不需要使用加号。有关资源对象的更多信息,请参见边箱。

来自:https : //developer.android.com/training/basics/firstapp/building-ui.html



6

开发人员指南中

android:id="@+id/my_button"

@字符串开头的at-符号()表示XML解析器应解析并扩展ID字符串的其余部分,并将其标识为ID资源。加号(+)表示这是一个新的资源名称,必须创建该名称并将其添加到我们的资源中(在R.java文件中)。Android框架提供了许多其他ID资源。引用Android资源ID时,不需要加号,但必须添加android包名称空间,如下所示:

android:id="@android:id/empty"


4

Eclipse有一个错误,有时候您只是创建了一个新的 @+id/..,即使将其编译干净后,也不会立即将其添加到R.java文件中。解决方案是重新启动Eclipse。

我认为应该尽快解决此问题,因为它可能(并且根据经验)会使一些开发人员误以为他们的语法有问题,即使实际上没有什么可调试的,也要尝试对其进行调试。


3
我改用Android Studio却再也没有回头的原因之一:)(我知道在您撰写答案时还不存在)
Konrad Morawski 2013年

4

Android使用一些称为资源的文件,其中存储XML文件的值。

现在,当您对XML对象使用@ id /时,它将尝试引用已在值文件中注册的ID。另一方面,当您使用@ + id /时,它将在“ +”符号所隐含的值文件中注册一个新的ID。

希望这可以帮助 :)。


4

@id/而且@android:id/不一样。

@id/在您的应用程序中引用ID,@android:id/引用Android平台中的项目。

Eclipse是错误的。


您是说,@id/ referencing ID in your application但是eclise Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')在我们使用它引用应用程序资源时给出。那么@id/和之间有什么区别@+id/?你怎么能说日食是错的?
维卡斯·帕蒂达

1
如果不向您显示@android:id建议,Eclipse是错误的。如果您使用@ id / myId而不在某处使用@ + id / myId声明它,那您就错了。必须使用@ + id / xxx在应用程序中的某个位置声明所有@ id / xxx。
Olegas 2011年

感谢您的澄清。我认为这里的Eclipse没错,而是根据布局元素的上下文显示了建议。正如@id/仅在情况下显示的那样RelativeLayout
Vikas Patidar 2011年

2

@+id和之间的区别@id是:

  • @+id用于为R.java文件中的视图创建ID 。
  • @id 用于引用为R.java文件中的视图创建的ID。

我们使用@+idandroid:id="",但是如果未创建id并在创建之前引用它,该怎么办(转发引用)。

在这种情况下,我们可以使用 @+id创建ID的方法,并且在定义视图时必须引用它。

请参考以下代码:

<RelativeLayout>

     <TextView
        android:id="@+id/dates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/spinner" />

   <Spinner
     android:id="@id/spinner"
     android:layout_width="96dp"
     android:layout_height="wrap_content"
     android:layout_below="@id/dates"
     android:layout_alignParentRight="true" />

</RelativeLayout>

在上面的代码中,Spinner的id @+id/spinner在其他视图中创建并且在定义Spinner时,我们引用的是上面创建的ID。

因此,如果要在创建视图之前使用视图,则必须创建ID。


1

之间的差异“@+id/”“@id/”Android中

第一个用于创建ID特定ui组件的,第二个用于引用特定ui的组件


1

如果视图项执行相同的操作,则可以@+id对任何布局中的每个条目使用,因为在多个文件的编译期间@+id/fooR.java文件仅创建一个枚举。因此,例如,如果每个页面上都有一个执行相同操作的保存按钮,那么我将android:id="@+id/button_save"在每个布局中使用。R.java文件的button_save只有一个条目。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.