R.java的Android冲突机制

R.java的Android冲突机制,android,collision,Android,Collision,我们都知道,当使用 @+id/foo Android在R.java中为我们创建了一个条目,如: public static final class id { public static final int foo=0x7f060005; } 如果在不同的xml文件中(比方说,在两个布局中)存在名称冲突,会发生什么情况?@+id机制确保我们在另一个id名称仍然存在的情况下覆盖该id名称,但在R.java中为我们生成了哪个?我认为它只是重用已经生成的标识符。我经常重复使用id

我们都知道,当使用

@+id/foo
Android在R.java中为我们创建了一个条目,如:

 public static final class id {
        public static final int foo=0x7f060005;
 }

如果在不同的xml文件中(比方说,在两个布局中)存在名称冲突,会发生什么情况?@+id机制确保我们在另一个id名称仍然存在的情况下覆盖该id名称,但在R.java中为我们生成了哪个?

我认为它只是重用已经生成的标识符。我经常重复使用id,从来没有遇到过问题。

如果id不存在或使用现有id,
@+id/foo
语法将添加。
当您找到dviewbyd时,它将在您调用该方法的视图上运行

因此,如果您有嵌套视图,则每个视图的id都是唯一的。 e、 g.View1->View2都有foo。
View1.findViewById(R.id.foo)
将不同于
View2.findViewById(R.id.foo)

编辑:我想最重要的是两个版面不能有相同的id。
有关id约束的更多信息:

我使用以下xml尝试了一个简单的Hello World应用程序:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

<TextView
        android:id="@+id/textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="text1"
/>

<TextView
        android:id="@+id/textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="text2"
/>

</LinearLayout>

我的两个TextView都有相同的id。它编译良好,运行良好,呈现两个TextView,当我执行findViewByid()时,会找到第一个TextView,并对其应用我的所有函数调用,如setText。理想情况下,AAPT应该捕捉到这一点,但显然没有。除非程序员依赖id,否则它不会严重破坏某些东西。所以,这有点像是在说:如果你愚蠢到编写这样的代码,那么你就应该崩溃


AAPT不会太在意它。对于它来说,这就像是没有程序员提供的显式ID的视图的简单扩展

如果使用include,第二点尤其重要,因为对include重复使用相同的布局通常会导致在视图树的多个分支中使用相同的ID。这是否意味着R.java仅充当名称容器?如果我在两个不同的xml文件中声明两个具有相同id名称的按钮,并尝试在活动中检索它,会发生什么情况?编辑:您刚才添加的链接使我认为布局也可以充当其中声明的ID的“名称空间”。+1是一个很好的例子。我更新了我的答案,添加了一个指向指南的链接,其中特别提到了这一点。我认为这可能会让开发人员(尤其是web开发人员)有点困惑,因为他们已经习惯于在整个应用程序中对元素使用唯一id,例如网页中的元素。@bodom_lx,我不认为您可能有两个文件:main_layout.xml和secondary_layout.xml,它们都带有
@+id/layout
。我还没有试过,但我认为你的应用程序不会编译。@JimSchubert你能扩展这个答案来解释当一个视图包含另一个视图时,id冲突会发生什么吗?它在实践中似乎工作得很好,但我不太清楚为什么。它重用它意味着如果存在另一个条目,它将覆盖R.java中的条目。Android如何在编译时决定保留哪一个和删除哪一个?这个问题毫无意义:如果它们有相同的名称,那么它们有相同的值,反之亦然。Android不会“保留”一个或“丢弃”一个@+id创建一个标识符,如果它还不存在的话。我的问题是因为对R.java机制的误解而产生的:我认为R.java包含指向视图对象的“指针”。现在我知道它只是一个标识符容器。因此,@+id机制现在是完全合乎逻辑的。1请大家努力对其进行测试并分享详细信息。