为什么有必要使用@ + id代替@id?

时间:2013-10-23 13:12:51

标签: android

我知道@+id@id之间的区别(请参阅此accepted answer)。但是,当我在@+id中写'+'时,我总觉得我正在做AAPT编译工作。

资源编译器是否无法自行推断是否必须创建标识符或仅重用标识符?基础哈希表结构可以完成这项工作:具有相同标识的每个资源都是相同的如果密钥不存在,只需创建它。

3 个答案:

答案 0 :(得分:1)

编译器可能无法区分“权利”和“权利”。和一个错误的' ID。如果它找到一个新的id(即一个不在底层哈希表中的id),它总是假设它是一个正确的新id。它无法区分实际的新ID和错误的ID。

答案 1 :(得分:1)

我可以想象它是为了帮助程序员。

如果你不需要@ + id构造,那么所有的@id引用/构造都是有效的,那么就很难找到错误,因为编译器不会在错误的引用上失败(因为它只是构造错字号)。

换句话说,必须在运行时发现所有id引用错误。

修改

刚刚注意到Piovezan关于你评论的类似答案:

Maybe, but the result is that many devs use @+id everywhere, since there is no error if the id is already defined, and everything works just fine. That means the compiler tests if the id already exist, but not if it does not exist, that's crazy

然后那些开发人员误用了@ + id构造imo。

选择区分@ + id和@id仍然要好得多,因为(对于那些不滥用@ + id的人),编译器有可能在错误的引用上给出编译时错误。

<强> EDIT2

并发表评论:

That's the link I gave in the first sentence. It explains the difference but does not answer why the '+' cannot be automatically infered by AAPT

我相信它可以,它不是由于上面的论证(我相信)。

答案 2 :(得分:0)

使用@ + id,您将向R.java添加id,允许您从Java类引用它,而使用@id则不是。只有在已创建特定ID并且您在另一个视图中引用它时,才可以使用@id,例如android:layout_below="@id/some_id"