android - 为什么设计者使用“@+id”而不是“@id”作为约束?
问题描述
我一直理解指示创建一个新ID(@+id
通常android:id
与@id
字符串开头的符号 (@) 表示 XML 解析器应该解析和扩展 ID 字符串的其余部分,并将其标识为 ID 资源。加号 (+) 表示这是一个新资源名称,必须创建并添加到我们的资源中(在 R.java 文件中)。Android 框架提供了许多其他 ID 资源。引用 Android 资源 ID 时,不需要加号,但必须添加 android 包命名空间...
这没有强制执行有点奇怪。您可以在@+id
任何地方多次使用相同的 id,这似乎不是错误或问题(除非您使用具有多个android:id
声明的相同 id)。
当在 Android Studio 中使用带有约束布局的图形设计器时(实际上它可能包含所有内容,我没有检查过),每当添加约束时,它都会像这样声明它们:
app:layout_constraintTop_toBottomOf="@+id/rlistfrag"
Whererlistfrag
被分配给android:id
同一文件中的另一个元素——如果它不存在,则设计者不可能创建约束,因此不会有上下文歧义。1 根据文档,这相当于两次声明“必须创建并添加到我们的资源中的新资源名称”。
似乎这里的语义至少与文档中描述的不完全一样。设计师为什么要这样做,那些省略的语义是什么?
- 或者那里可以?这一切对我来说意味着元素可以按任何顺序处理,所以关键是每当第一次遇到一个 id 时,它都会被创建,即使它与现有元素没有关联。
在布局资源的文档指南中有一点确认 id 只会在第一次设置:
加号 + 表示这是一个新的资源 ID,如果它不存在,aapt 工具将在 R.java 类中创建一个新的资源整数。
这并不意味着元素没有按顺序处理。
解决方案
它适用于所有布局组件。每当您想提及“id”时,都必须使用“@+id”
推荐阅读
- javascript - 做出反应。可编辑表
- javascript - 如何使用带有 bitbucket 访问令牌的纯 javascript/(ajax) 来获取 JSON 数据?
- c++ - BROWSEINFO 在 Windows 10 上获取选择目录的问题
- google-smart-home - 带有 lambda 函数的谷歌智能家居操作
- python - 压缩具有相同输出的python列表
- html - 角度:L形边框
- php - 我有哪个 PHP 版本?
- reactjs - 有没有办法将firebase函数console.log输出到本地命令行
- python - 如何使用标志修改创建 QMessageBox 的子类?
- css - 如何在 Reactjs 中显示子菜单?