ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

但在下图中,Eclipse 不建议使用任何类型的 @android:id/

https://i.stack.imgur.com/zgbUz.png

@id/ 和 @android:id/ 是一样的吗?

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

b
blahdiblah

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

更多信息

根据您在聊天中的说明,您说您遇到了这样的问题:

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

嗯,这取决于上下文,当您使用 android:id 的 XML 属性时,您将指定一个新的 id,并指示解析器(或称其为构建器)在 {2 },因此您必须包含一个 + 符号。

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

再次提供更多信息

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


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

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

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

@schwiz:我们如何在布局中使用它?
假设你有我在答案中定义的资源文件,那么在你的布局中你可以有 <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/ 放在哪里,该文件的名称是什么?如果您对此有任何有用的链接,请在此处发布。
这是您需要了解的有关资源命名约定等的所有信息。您可以将文件放在 res/values/ 中,约定将其命名为 ids,但您可以随意调用它。 developer.android.com/guide/topics/resources/…
A
AVI

简而言之

android:id="@+id/my_button"

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

尽管

android:layout_below="@id/my_button"

它只是帮助参考已经生成的 id ..


P
Pang

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

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


F
Fortran

它非常简单:

"@+..." - 创建新的

“@...” - 现有链接

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


J
Jeff Axelrod

Developer Guide

android:id="@+id/my_button"

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

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


j
josephus

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

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


我切换到 Android Studio 并且从不回头的原因之一 :) (我知道在你写答案的时候它还不存在)
T
Tanuj Nayak

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

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

希望这可以帮助 :)。


A
AskNilesh

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

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

日食是错误的。


你说的是 @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/ 有什么区别呢?你怎么能说日食是错的?
如果没有向您显示 @android:id 建议,则 Eclipse 是错误的。你错了,如果你使用@id/myId 而没有在某处用@+id/myId 声明它。所有@id/xxx 都必须使用@+id/xxx 在您的应用程序中的某处声明。
感谢您的澄清。我认为这里的 Eclipse 并没有错,而是根据我们的布局元素的上下文显示建议。因为它仅在 RelativeLayout 的情况下显示 @id/
R
Ray Hunter

@+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。


S
Suraj Vaishnav

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


A
AskNilesh

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

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