43

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

4

5 回答 5

58

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

完全来自文档

字符串开头的符号 (@) 表示 XML 解析器应该解析和扩展 ID 字符串的其余部分,并将其标识为 ID 资源。加号 (+) 表示这是一个新资源名称,必须创建并添加到我们的资源中(在 R.java 文件中)。Android 框架提供了许多其他 ID 资源。引用 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的检查将位于Button带有 id start的下方。

于 2012-06-22T17:13:08.897 回答
5

所有其他答案都忘了提到这件小事。

当使用@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

于 2018-10-13T17:06:37.760 回答
2

有时您必须使用 + 号。例如,当您使用时<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').

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

于 2017-02-13T15:24:28.840 回答
2

android:id="@+id/my_button"

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

android:layout_below="@id/my_button"

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

于 2015-11-03T03:57:28.090 回答
0

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

android:id=”@+id/toolbar

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

android:layout_below=”@id/toolbar”
于 2017-10-18T00:51:18.467 回答