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