R.java的Android id冲突机制

发布于 2024-08-18 15:50:12 字数 328 浏览 4 评论 0原文

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

@+id/foo

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

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

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

We all know that when generating an id for Android using

@+id/foo

Android creates for us an entry in R.java like:

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

What happens if there is a name collision in different xml files (let's say, inside two layouts)? The @+id mechanism ensures us to overwrite the id name if another one still exist, but which one is generated in R.java for us?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

骑趴 2024-08-25 15:50:12

如果 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

The @+id/foo syntax will add if the id doesn't exist or use the existing id.
When you findViewById, it will operate on the view on which you call the method.

So, if you have nested Views, your id will be unique for each view.
e.g. View1 -> View2 both have foo.
View1.findViewById(R.id.foo) will be different from View2.findViewById(R.id.foo)

edit: I guess the main thing to mention is that two layouts can't have the same id.
For more information on the id constraint: http://d.android.com/guide/topics/ui/declaring-layout.html

请远离我 2024-08-25 15:50:12

我尝试了一个简单的 Hello World 应用程序,其中包含以下 xml:

<?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。

I tried a simple Hello World application with the following xml:

<?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>

Both my textviews have the same id. It compiles fine, runs fine, renders both the TextViews, and when i do a findViewByid() the first one gets found and all my function calls like setText are applied to it. Ideally, the AAPT should catch this but apparently it doesn't. It wont break something terribly unless the programmer relies on the id's. So its kind of like saying: if you are dumb enough to write such a code then you deserve to crash.

The AAPT won't care too much about it. For it, this is like a simple extension of Views with no explicit ids provided by the programmer.

暖伴 2024-08-25 15:50:12

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

I think it simply reuses the identifier if it's already generated. I tend to reuse IDs quite a bit, and have never run into a problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文