【发布时间】:2020-11-29 08:44:02
【问题描述】:
我一直认为@+id 表示创建新ID(通常与android:id 一起使用),@id 表示在其他地方引用它,如在in a popular question here 和the official documentation 中详细解释的那样:
字符串开头的符号 (@) 表示 XML 解析器应该解析和扩展 ID 字符串的其余部分,并将其标识为 ID 资源。 加号 (+) 表示这是一个必须创建的新资源名称并添加到我们的资源中(在 R.java 文件中)。 Android 框架还提供了许多其他 ID 资源。 引用Android资源ID时,不需要加号,但必须添加android包命名空间...
这没有强制执行有点奇怪;你可以在任何地方都使用@+id,多次使用相同的ID,这似乎不是错误或问题(除非你使用相同的ID和多个android:id声明)。
当在 Android Studio 中使用带有约束布局的图形设计器时(实际上它可以与所有东西一起使用,我没有检查过),每当添加约束时,它都会像这样声明它们:
app:layout_constraintTop_toBottomOf="@+id/rlistfrag"
其中rlistfrag 被分配给同一文件中具有android:id 的另一个元素——如果它不存在,则设计者不可能创建约束,因此不会有上下文歧义。 1 根据文档,这相当于两次声明“必须创建并添加到我们的资源中的新资源名称”。
似乎这里的语义至少与文档中描述的不完全一样。设计者为什么要这样做,那些省略的语义是什么?
- 或者可以吗?这一切对我来说意味着元素可以按任何顺序处理,所以关键是只要第一次遇到一个 id 就会创建它,即使它与现有元素没有关联。
guide on layout resources 文档中有一点确认 id 只会在第一次设置:
加号 + 表示这是一个新的资源 ID,aapt 工具将在 R.java 类中创建一个新的资源整数,如果它尚不存在。
这并不一定意味着元素没有按顺序处理。
【问题讨论】:
标签: android android-studio android-layout designer