何时应该使用 `@+id` 而不是 `@id`?

4
我在一个<merge>中有很多View,我将其包括在一个RelativeLayout中。 我试图引用这些已经包含的View的ID来作为其他View的锚点,但Eclipse报错说无法解析这些ID。 我找到了一种解决方法,即在第一次引用它们时使用@+id而不是在实际定义它们所引用的对象时才使用@id。我已经在Style和所声明的包含的<merge>中定义了这两个ID,因此如果我继续重复定义ID,感觉有点效率低下。

这样做是否正确? 我假设这样做是不好的,因为'+'符号会再次初始化。我的当前假设是,当您首次使用该ID时应使用@+id,而不是在初始化表示ID的对象之前使用@id,就像C/C++ 一样,它们要求在使用函数的代码之前至少有一个函数原型。

我还有另一个问题:当您使用基于GUI的Eclipse UI构建器时,我注意到他们总是使用@+id而不是@id。这是否可行? 对我来说,这似乎效率低下;好像应用程序将花费更多的时间来确定ID是否已在R.id中声明。

1个回答

3
使用@+id格式告诉Android资源编译器为您的元素分配一个ID,它本身并不是一个ID。因此,如果我使用@+id/myNewId,资源编译器将创建一个名为myNewId的新ID并为其提供一个数字。实际数字可以从您的代码中访问,如R.id.myNewId
如果您使用@id,编译器将查找R.id.id。您可以在XML文件中定义自己的ID,如此处所述:http://developer.android.com/guide/topics/resources/more-resources.html#Id。您可以在res/values/[your_filename].xml中创建自己的文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item
        type="id"
        name="id_name" />
</resources>

然后引用@id_name,例如:

您还可以使用在Android命名空间中定义的ID:@android:id/empty

这在Android文档中得到了很好的解释:http://developer.android.com/guide/topics/ui/declaring-layout.html#id

在这里也有一些进一步的讨论:android:id什么是加号的含义


等等,那么我可以创建一个名为id的xml文件,在那里初始化我需要的所有ID,然后再也不必使用@+id了吗? - cesar
我已经编辑过来解释了如何操作,但是除非你想确保在同一个视图中使用相同的ID来控制两个不同的控件(这是你永远不想做的),否则没有必要这样做。我想@+id是一种约定,早期开发人员在每次向视图添加新小部件时都必须在ID文件中添加每个ID,他们感到非常烦恼后才加入的。 - craigmj
不用担心,我已经阅读了文档;我只是想确认一下,但还是谢谢你的额外努力!我的问题是,当我使用mergeinclude标签时,有时会在eclipse中遇到错误。不确定是adb的问题还是android资源xml解析器的问题。这让我想知道何时应该使用+。 - cesar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接