16

我们都知道,在为 Android 生成 id 时,使用

@+id/foo

Android 为我们在 R.java 中创建了一个条目,例如:

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

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

4

3 回答 3

25

@+id/foo如果 id 不存在或使用现有 id,语法将添加。
当您 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

于 2010-01-21T17:55:32.070 回答
4

我尝试了一个带有以下 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>

我的两个文本视图都具有相同的 ID。它编译得很好,运行得很好,同时渲染了两个 TextView,当我执行 findViewByid() 时,第一个被找到,并且我的所有函数调用(如 setText)都应用于它。理想情况下,AAPT 应该抓住这一点,但显然没有。除非程序员依赖 id,否则它不会严重破坏某些东西。所以这就像是在说:如果你傻到写出这样的代码,那么你应该崩溃。

AAPT 不会太在意它。对它来说,这就像一个简单的视图扩展,程序员没有提供明确的 id。

于 2012-01-23T19:12:10.273 回答
2

我认为它只是重用了已经生成的标识符。我倾向于重复使用 ID,并且从未遇到过问题。

于 2010-01-21T17:53:13.383 回答