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