【问题标题】:R.java- Working of duplicate View IDs in androidR.java- 在 android 中处理重复的视图 ID
【发布时间】:2012-12-14 14:13:57
【问题描述】:

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

【问题讨论】:

标签: android


【解决方案1】:

如果您有两个不同的人,在 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 的引用。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • k。但是我们只是通过 R.id.viewId 找到视图。我们没有提到任何布局。它是如何工作的?
    • 因为在一个活动中你使用了一些独特的布局,例如 R.layout.main
    • 或者即使在膨胀布局的情况下,你也会得到这样的视图 view.finedViewbyID(R.id.some_id) 所以你总是从一些特定的 XML 中获取视图
    【解决方案3】:

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

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

    【讨论】:

    • 那么它如何识别具有相同id的两个不同视图。
    • 添加了在 RelativeLayouts 中使用的说明。显然,在布局中,每个 id 都必须是唯一的。 findViewById 仅对当前布局进行操作,因此返回的视图将是正确的。
    猜你喜欢
    • 2012-05-03
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多