【发布时间】:2012-12-14 14:13:57
【问题描述】:
假设如果我在两个不同的布局中为两个不同的视图使用相同的 id,我可以看到在 R.java 中的类“id”中只为 id 创建了一个引用。实际上我认为它应该在尝试在构建的“id”类中添加具有相同名称的常量时显示错误。为什么它没有显示错误?它如何识别具有单个id的两个不同视图?
【问题讨论】:
-
它在 xml 本身中给你警告(黄色下划线)。
标签: android
假设如果我在两个不同的布局中为两个不同的视图使用相同的 id,我可以看到在 R.java 中的类“id”中只为 id 创建了一个引用。实际上我认为它应该在尝试在构建的“id”类中添加具有相同名称的常量时显示错误。为什么它没有显示错误?它如何识别具有单个id的两个不同视图?
【问题讨论】:
标签: android
如果您有两个不同的人,在 2 个不同的组中,都叫 Vicky,那么在调用这个名字 (=id) 时那个人是谁并不重要。如果您在第一组中呼叫“Vicky”,则该组中的 Vicky 会响应。
在 android 中,您可以使用setContentView(<layout file>) 为活动分配一个“组”视图,其中<layout file> 是组。
如果您通过 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 对象的引用。它们是可以被不同布局中的多个视图使用的标识符。通过在布局文件中查找标识符,您可以获得对使用它的 View 的引用。
【讨论】:
您可以对不在同一文件中的不同xml 文件中的视图ids 使用相同的字符串名称。这就是编译器如何区分不同布局内的不同视图
【讨论】:
如果您对两个不同的视图使用相同的字符串,它将只生成一个 id,并且是相同的。例如,这是一个在 RelativeLayouts 中非常有用的功能,因为您可以多次使用 @+id 并知道它将引用相同的 id——视图本身需要具有唯一的 id,但 id 可能被引用布局语句。
这是它的设计方式,而不是错误。
【讨论】: