R.java的Android ID冲突机制

我们都知道,为Android生成一个ID时使用

@+id/foo 

Android为我们创build了一个R.java条目,如下所示:

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

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

Solutions Collecting From Web of "R.java的Android ID冲突机制"

如果id不存在或者使用现有的id, @+id/foo语法将会被添加。
当你findViewById时,它将在你调用方法的视图上进行操作。

所以,如果你有嵌套的视图,你的ID将是唯一的每个视图。 例如View1 – > View2都有foo。 View1.findViewById(R.id.foo)将不同于View2.findViewById(R.id.foo)

编辑:我想主要提到的是,两个布局不能有相同的ID。 有关id约束的更多信息: http : //d.android.com/guide/topics/ui/declaring-layout.html

我用下面的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> 

我的textviews都有相同的ID。 它编译好,运行良好,呈现两个TextViews,当我做一个findViewByid()第一个被发现,我所有的函数调用像setText被应用到它。 理想情况下,AAPT应该抓住这一点,但显然并非如此。 除非程序员依靠id,否则不会破坏一些可怕的东西。 所以就像这样说:如果你笨到写这样的代码,那么你应该崩溃。

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

如果它已经生成,我认为它只是重用了标识符。 我倾向于重复使用ID,而且从来没有遇到过问题。