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

时间:2011-02-17 06:52:32

标签: android android-xml

  

@id/@+id/之间的差异是什么?

@+id/ 中,加号[{1}}指示创建新资源名称并添加到+文件,但 {{ 1}} ?从ID的文档:引用Android资源R.java时,您不需要加号,但必须添加android包命名空间,如下所示:

@id/

但是在下图中,Eclipse没有提出任何类型的ID

Image showing the suggestion for the @/id and @+/id

  

android:id="@android:id/list" @android:id/是否相同?

13 个答案:

答案 0 :(得分:339)

您使用Android resources引用已在Android系统中定义的@android:id/..,同时访问您在项目中定义/创建的资源,使用@id/..

更多信息

根据你在聊天中的澄清,你说你有这样的问题:

  

如果我们使用android:id="@id/layout_item_id"则不起作用。取而代之的是@+id/,那么这里的区别是什么?那是我原来的问题。

嗯,这取决于上下文,当你使用android:id的XML属性时,你正在指定一个新的id,并指示解析器(或称之为构建器)来创建一个R.java中的新条目,因此您必须添加+符号。

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

再次提供更多信息

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

答案 1 :(得分:84)

+符号是将ID添加到资源ID列表的快捷方式。否则你需要将它们放在像这样的xml文件中

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

答案 2 :(得分:42)

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

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

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

有什么区别?

..我很高兴你问☺

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

'+'表示如果符号尚不存在则创建符号。在引用android:symbols时你不需要它(也不应该使用它),因为平台已经为你定义了这些,你无论如何都不能在那个命名空间中创建自己的。

此命名空间是框架的命名空间。 例如,你需要使用@android:id/list,因为这是框架期望找到的id ..(框架只知道android命名空间中的id。)

完全从此source

复制

答案 3 :(得分:36)

简而言之

android:id="@+id/my_button"
  

+ id加号告诉android在Resources中添加或创建一个新的id。

android:layout_below="@id/my_button"
  

它只是帮助引用已经生成的id ..

答案 4 :(得分:9)

  

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

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

答案 5 :(得分:7)

非常简单:

&#34; @ + ...&#34; - 创建新的

&#34; @ ...&#34; - 现有链接

来源: enter image description here

答案 6 :(得分:6)

来自Developer Guide

android:id="@+id/my_button"

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

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

答案 7 :(得分:4)

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

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

Eclipse错了。

答案 8 :(得分:4)

Eclipse中存在一个错误,有时如果您刚刚创建了一个新的@+id/..,它将不会立即添加到R.java文件中,即使在清理项目之后也是如此。解决方案是重新启动Eclipse。

我认为应该尽快解决这个问题,因为它可能会(并且从经验中)将一些开发人员误认为他们的语法有问题,并尝试调试它,即使没有什么可调试的。

答案 9 :(得分:4)

Android使用一些名为resources的文件,其中存储了XML文件的值。

现在,当您将@ id /用于XML对象时,它正在尝试引用已在values文件中注册的id。另一方面,当您使用@ + id /时,它会在值文件中注册一个新的id,如'+'符号所示。

希望这会有所帮助:)。

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

@+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/spinner的id是在其他视图中创建的,在定义微调器时我们引用上面创建的id。

因此,如果我们在创建视图之前使用视图,则必须创建id。