1

假设如果我在两个不同的布局中为两个不同的视图使用相同的 id,我可以看到只为 R.java 中的“id”类中的 id 创建了一个引用。实际上我认为它应该在尝试在构建的“id”类中添加具有相同名称的常量时显示错误。为什么它不显示错误?它如何识别具有单个 id 的两个不同视图?

4

3 回答 3

5

如果你有两个不同的人,在 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 对象的引用。它们是可以被不同布局中的多个视图使用的标识符。通过在布局文件中查找标识符,您可以获得对使用它的视图的引用。

于 2012-12-14T06:02:49.497 回答
1

ids您可以使用相同的字符串名称在不同文件中查看,xml而不是在同一个文件中。这就是编译器如何区分不同布局内的不同视图

于 2012-12-14T05:51:48.480 回答
0

如果您对两个不同的视图使用相同的字符串,它将只生成一个 id,并且是相同的。例如,这是一个在 RelativeLayouts 中非常有用的功能,因为您可以多次使用 @+id 并知道它将引用相同的 id——视图本身需要具有唯一的 id,但这些 id 可能会被引用布局语句。

这是它的设计方式,而不是错误。

于 2012-12-14T05:17:21.497 回答