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

时间:2012-06-22 17:09:34

标签: android xml

我刚刚开始使用android,并且已经完成了大约5个布局文件。但是,我刚才意识到我一直在互换使用@id和@ + id,但我不确定两者之间的确切区别是什么。

5 个答案:

答案 0 :(得分:44)

在为视图定义自己的ID时,需要使用@+id

正好来自 docs

  

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

现在我为你添加实际例子:

<Button 
   android:id="@+id/start"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
/>

<Button 
   android:id="@+id/check"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_below="@id/start"
/>

所以在这里,你创建了两个IDs,开始并检查。然后,在您的应用程序中,您可以使用findViewById(R.id.start)连接到它们。

android:layout_below="@id/start"引用现有的id.start,表示您的Button ID 检查位于{{1}下方} id 开始

答案 1 :(得分:3)

所有其他答案都忘记提及这一小事情。

在使用 @id / 引用已经生成的android资源时,请确保您所引用的资源是在较早而不是以后定义的。

那不是这个:

<Button 
 android:id="@+id/check"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@id/start" 
 />
<Button 
 android:id="@+id/start"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />

使用此:

<Button 
 android:id="@+id/start"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />
<Button 
 android:id="@+id/check"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@id/start"
 />

在第一个示例中,您引用的是资源 @ id / start ,该资源是在您访问资源之后生成的。 尽管这在本机android情况下可行,但是如果您要在react-native或ionic或任何其他混合平台中使用此代码,则会生成未找到资源的错误。

因此请小心生成资源ID,然后再将其用作 @id /

答案 2 :(得分:1)

<强> 机器人:ID = “@ + ID / my_button”

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

<强> 机器人:layout_below = “@ ID / my_button”

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

答案 3 :(得分:1)

有时你必须使用+号。例如。当您使用<include ... />时,包含的文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.FloatingActionButton xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    (...)
    app:layout_anchor="@+id/view_pager"
    app:layout_anchorGravity="top|right|end"
 />

如果您未在+中添加"@+id/view_pager",则在构建项目时会出现错误:

Error:(9, 24) No resource found that matches the given name (at 'layout_anchor' with value '@id/view_pager').

在图书馆的项目中发生在我身上。

答案 4 :(得分:0)

为了访问Java中的小部件(或组件)或使其他人依赖它,我们需要一个唯一的值来表示它。该唯一值由android:id属性提供,它实质上将作为后缀提供的id添加到@ + id /到id资源文件以供其他人查询。可以像这样定义工具栏的ID,

android:id=”@+id/toolbar

现在可以通过findViewById(...)跟踪以下id,它在res文件中查找id,或者只是R.id目录并返回有问题的View类型。 另一个,@ id,与findViewById(...)的行为相同 - 按提供的ID查找组件,但仅为布局保留。最常见的用途是相对于它返回的组件放置一个组件。

android:layout_below=”@id/toolbar”