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

Posted

技术标签:

【中文标题】Android中“@id/”和“@+id/”的区别【英文标题】:Difference between "@id/" and "@+id/" in Android 【发布时间】:2011-06-28 21:29:09 【问题描述】:

@id/@+id/ 有什么区别?

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

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

但在下图中,Eclipse 并没有建议任何类型的@android:id/

@id/@android:id/ 是否相同?

【问题讨论】:

来自android docs:(花了很长时间才找到这个,我正在查找一个不相关的问题)developer.android.com/guide/topics/resources/… 【参考方案1】:

你引用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" 不会识别 ID 为 myTextView 的元素,如果它写在您使用它的元素之后。

【讨论】:

@MarcoW 这对我帮助很大。我很难找到这个问题的解决方案(或者更确切地说是制定正确的搜索条目)。我想它可能应该有自己的问题+答案。 谢谢!我遇到了同样的问题,并且文档对这个主题没有太多说明。但很明显:我们在这里遇到的问题并不常见...... 我总是在 android:id 和 android:layout_below 上使用@+id/,有问题吗? 让我生气的是,使用 Eclipse 中的“图形布局”将小部件拖到布局中,生成的 XML 将包含对使用加号的其他小部件的引用,例如 android:layout_below="@+id/numberPicker1" 和 @987654334 @。 :-( 在我开始骂人之前我先闭嘴。 @melanke:将+ 放入layout_belowandroid:id 真的很好,因为The '+' means to create the symbol if it doesn't already exist 正如 Tanmay Mandal 在他的好(但被低估的)答案中提到的那样。正因为如此,也没有负面的运行时影响(虽然可能是编译时间的微小增加^^)。【参考方案2】:

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

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

【讨论】:

@schwiz:我们如何在布局中使用它? 想象你有我在回答中定义的资源文件,那么在你的布局中你可以有&lt;View android:id="@id/my_logo"/&gt; 如果你没有我上面定义的资源文件,那么你需要像@ 987654324@ 注意:您只需要执行一次 +id,因此如果在另一个布局文件中执行 您下次不需要包含 '+' 字符您在布局中使用相同的 id。 @schwiz:好的,这很有用,但我们必须将文件放在哪里 res/drawable/res/layout/res/values/ 以及该文件的名称是什么?如果您对此有任何有用的链接,请在此处发布。 这里是您需要了解的有关资源命名约定等的所有信息。您可以将文件放在 res/values/ 中,约定将其命名为 ids,但您可以随意调用它。 developer.android.com/guide/topics/resources/…【参考方案3】:

简而言之

android:id="@+id/my_button"

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

同时

android:layout_below="@id/my_button"

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

【讨论】:

【参考方案4】:

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

发件人:https://developer.android.com/training/basics/firstapp/building-ui.html

【讨论】:

【参考方案5】:

很简单:

“@+...” - 新建

“@...” - 现有链接

来源: https://developer.android.com/guide/topics/resources/layout-resource.html#idvalue

【讨论】:

【参考方案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】:

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

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

【讨论】:

我切换到 Android Studio 并且从未回头的原因之一 :)(我知道在您写答案时它还没有)【参考方案8】:

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

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

希望这会有所帮助:)。

【讨论】:

【参考方案9】:

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

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

Eclipse 出错了。

【讨论】:

你说的是 @id/ referencing ID in your application 但是当我们使用它来引用应用程序资源时,eclis 给出了Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')。那么@id/@+id/ 有什么区别呢?你怎么能说日食是错的? Eclipse 在没有向您显示@android:id 建议的情况下是错误的。你错了,如果你使用@id/myId 而没有在某处用@+id/myId 声明它。所有@id/xxx 都必须使用@+id/xxx 在应用程序的某处声明。 感谢您的澄清。我认为这里的 eclipse 并没有错,而是根据我们的布局元素的上下文显示建议。正如它所显示的 @id/ 仅在 RelativeLayout 的情况下【参考方案10】:

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

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

我们使用@+idandroid:id="",但是如果id 没有创建并且我们在创建之前引用它会怎样(前向引用)。

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

请参考以下代码:

<RelativeLayout>

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

   <Spinner
     android:id="@id/spinner"
     android:layout_
     android:layout_
     android:layout_below="@id/dates"
     android:layout_alignParentRight="true" />

</RelativeLayout>

在上面的代码中,Spinner @+id/spinner 的 id 是在其他视图中创建的,在定义微调器时,我们指的是上面创建的 id。

所以,如果我们在创建视图之前使用视图,我们必须创建 id。

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

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

【讨论】:

以上是关于Android中“@id/”和“@+id/”的区别的主要内容,如果未能解决你的问题,请参考以下文章

Android XML文件中@id和@+id的区别

Android查缺补漏(View篇)--布局文件中的“@+id”和“@id”有什么区别?

@+id/android:list 和 @+id/list 有啥区别

Android @id和@+id区别

Android中@id与@+id区别

Android中@id与@+id区别