2013-10-23 46 views
8

我知道@+id@id之间的区别(请参阅此accepted answer)。但是,当我在@+id中编写'+'时,我总是感觉到我正在执行AAPT编译器的工作。为什么需要使用@ + id而不是@id?

是否有一个原因,如果必须创建一个标识符或只是重复使用资源编译器本身并不能推断?一个潜在的hashtable结构可以完成这项工作:每个具有相同id的资源进入同一个桶,如果该键不存在,就创建它。

+0

http://stackoverflow.com/questions/5025910/difference-between-id-and-id-in-android - 请参考 – N20084753

+0

@ N20084753他已经在OP中提到过它。 – Piovezan

+0

@ N20084753这是我在第一句话中给出的链接。它解释了差异,但没有回答为什么'+'不能被AAPT自动传送。 –

回答

0

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

+1

谢谢,但正如我所说,我知道所有这一切。问题是为什么加号是必要的。编译器应该很容易知道标识符是否已经存在,所以我不明白为什么我必须给它这个信息。 –

1

也许编译器将无法一个“正确”和“错误”的ID来区分。如果它找到一个新的id(即不在底层哈希表中),它总是会认为它是一个正确的新id。它无法区分实际的新ID和打错的ID。

+0

也许,但结果是许多开发人员在任何地方都使用@ + id,因为如果已经定义了id,则没有错误,并且一切正常。这意味着编译器会测试这个id是否已经存在,但如果它不存在的话,那就太疯狂了。 –

1

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

如果你不需要@ + id构造,那么所有的@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 

那么那些开发商都IMO滥用@ + ID建设。因为(对于那些没有误用@ + 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 

我认为是可以的,它只是不因上述论证(我相信)。

+0

这样做的目的是帮助开发者的确是一种可能性。但是,尝试在eclipse设计器中拖放一些UI元素,就会发现它使用@ + id EVERYWHERE!由于它是一个官方的Android工具,我发现这种行为很奇怪,因为大多数新用户都会使用该设计器,并查看要学习的代码。 –

+0

我可以看到你的观点,但因为它是一个工具,所以它肯定会生成有效的引用,并且可能有理由使用@ + id(我猜它们更简单)。底线,他们不需要@id带来的编译时帮助。 – cYrixmorten

相关问题