Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么有必要使用@+;id而不是@id?_Android - Fatal编程技术网

Android 为什么有必要使用@+;id而不是@id?

Android 为什么有必要使用@+;id而不是@id?,android,Android,我知道@+id和@id之间的区别(见此)。然而,当我在@+id中编写“+”时,我总是觉得我在做AAPT编译器的工作 是否存在资源编译器无法自行推断标识符是否必须创建或只是重复使用的原因?底层哈希表结构将完成此工作:具有相同id的每个资源都进入相同的存储桶,如果密钥不存在,只需创建它。使用@id+id,您就可以将id添加到R.java中,这样您就可以从java类中引用它,而使用@id则不能。只有在已经创建了特定id并且您正在另一个视图中引用它时,您才能使用@id。例如,android:layout

我知道
@+id
@id
之间的区别(见此)。然而,当我在
@+id
中编写“+”时,我总是觉得我在做AAPT编译器的工作


是否存在资源编译器无法自行推断标识符是否必须创建或只是重复使用的原因?底层哈希表结构将完成此工作:具有相同id的每个资源都进入相同的存储桶,如果密钥不存在,只需创建它。

使用@id+id,您就可以将id添加到R.java中,这样您就可以从java类中引用它,而使用@id则不能。只有在已经创建了特定id并且您正在另一个视图中引用它时,您才能使用@id。例如,
android:layout\u below=“@id/some\u id”

编译器可能无法区分“正确”和“错误”id。如果它找到一个新id(即不在基础哈希表中的id),它总是假定它是一个正确的新id。它无法区分实际的新id和键入错误的id。

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

如果您不需要@id构造,那么所有@id引用/构造都是有效的,那么就很难跟踪错误,因为编译器不会在错误的引用上失败(因为它只会构造typo 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结构

最好还是选择区分@+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

我相信它可以,但由于上面的论证(我相信),它不可能实现。

-参考this@N20084753他已经在作品@N20084753中提到了这一点。这是我在第一句中给出的链接。它解释了差异,但没有回答AAPT无法自动推断“+”的原因。@AurélienRibon:抱歉,忘记了查看链接并误解了问题。这是一个非常好的问题,但据我所知,加号告诉XML解析器生成一个整数,该整数与ID一起用于在R.java文件中创建一个新条目。没有它,解析器将查找具有相同名称的现有条目。缺少这样的映射会触发错误“找不到与给定名称匹配的资源”,为什么在确定/知道这是新ID时让解析器检查每个ID。谢谢,但正如我所说,我知道所有这些。问题是为什么加号是必要的。编译器应该非常容易知道标识符是否已经存在,所以我不明白为什么我必须给它这段信息。也许,但结果是许多开发人员在任何地方都使用@+id,因为如果已经定义了id,就不会有错误,而且一切都正常。这意味着编译器会测试id是否已经存在,但如果它不存在则不会测试,这太疯狂了。为了帮助开发人员而这样做确实是可能的。但是,尝试在eclipse设计器中拖放一些UI元素,您将看到它在任何地方都使用@+id!由于它是一个官方的Android工具,我发现这种行为很奇怪,因为大多数新用户都会使用该设计器,并查看代码进行学习。我可以理解你的观点,但由于它是一个工具,它肯定会生成有效的引用,并且可能有理由使用@+id(我想对他们来说更简单)。总之,他们不需要@id带来的编译时帮助。