假设如果我在两个不同的布局中为两个不同的视图使用相同的 id,我可以看到只为 R.java 中的“id”类中的 id 创建了一个引用。实际上我认为它应该在尝试在构建的“id”类中添加具有相同名称的常量时显示错误。为什么它不显示错误?它如何识别具有单个 id 的两个不同视图?
3 回答
如果你有两个不同的人,在 2 个不同的组中,都叫 Vicky,那么在调用这个名字 (=id) 时那个人是谁并不重要。如果您在第一组中呼叫“Vicky”,则该组中的 Vicky 会响应。在 android 中,您可以使用setContentView(<layout file>)
where <layout file>
is group 为活动分配一个“组”视图。如果您通过 findViewWithId() 请求一个带有不可用 id 的视图(例如,不在加载的布局文件中),它会返回 null。
例子:
layout1.xml 包含
<View id="@+id/name1"/>
<View id="@+id/name2"/>
<View id="@+id/name3"/>
layout2.xml 包含
<View id="@+id/name1"/>
<View id="@+id/name3"/>
调用findViewById(R.id.name1)
第一个和第二个布局文件,将返回第一个视图。但是当你调用findViewById(R.id.name2)
第二个布局时,它会返回null
. id 确实存在于 A 布局文件中,但根本不存在于“加载”的布局文件中。
Id 不是对 View 对象的引用。它们是可以被不同布局中的多个视图使用的标识符。通过在布局文件中查找标识符,您可以获得对使用它的视图的引用。
ids
您可以使用相同的字符串名称在不同文件中查看,xml
而不是在同一个文件中。这就是编译器如何区分不同布局内的不同视图
如果您对两个不同的视图使用相同的字符串,它将只生成一个 id,并且是相同的。例如,这是一个在 RelativeLayouts 中非常有用的功能,因为您可以多次使用 @+id 并知道它将引用相同的 id——视图本身需要具有唯一的 id,但这些 id 可能会被引用布局语句。
这是它的设计方式,而不是错误。