如何在Android Studio中从XML文件中查找@值

4
在Android Studio中,如果我写下以下内容:
android:background="@color/dark_grey"

需要在res/values/colors.xml文件中查找值为dark_grey的内容。

如果我有:

<include layout="@layout/content_reminders" />

该值将被查找为res/layout/content_reminders.xml

问题:

  • 查找过程是如何 确切地 进行的?

  • 如何设置更多的查找目录? 例如,如果我想在那里有@layout2/something_else,是否允许?无论哪种情况,在哪里查找@layout?它在项目配置中吗?

[添加问题]

  • Gradle如何处理歧义?

这两者的格式非常不同:一个是@color/dark_grey,另一个是@layout/content_reminders。即使接受文件夹res/layoutres/values是特殊的并以特殊方式处理它们,Gradle如何知道当我输入@layout/content_reminder时,我不是在谈论文件res/values/layout.xml中的值content_reminder(而不是res/layout下的layout.xml文件)?

4个回答

2
Android Studio会为您的resources进行索引。您放在res/values/xxxxx.xml中的任何内容都将与使用像<color><string>这样的标签一起索引,以及xml文件中的行号。
之所以进行索引是因为这样更有效,并且您需要在自动完成期间显示所有选项。因此,当您单击@color/dark_grey时,它会搜索索引并转到定义drak_grey的文件中的行号。这就是Studio中的lookup如何工作的。
您不能在<include>标记中添加@layout2之类的东西,因为没有为您添加它的规定。但是,您可以为自定义View或ViewGroup添加自己的属性。即使在这种情况下,Android Studio也会为您执行查找,您无需执行任何其他操作。
至于范围,它发生在Project范围内。将查找您依赖项(模块)中的所有resources。如果您有一个模块,但尚未将其添加为依赖项,则该模块将不会用于查找。我认为索引和查找不是在原始源文件上进行的,而是在gradle构建生成的文件上进行的。 layoutcolorstring和其他标记都是特殊的。当您键入@layout/时,自动完成将显示所有布局文件。这件事在Android Studio中完成。IDE理解这些标记。因此,您无法引入新标记。
Gradle如何识别这个呢?好吧,我不确定Gradle是否背后推动。 SDK附带的Build Tools可能要负责这一点。

谢谢Henry。我很困惑,因为这两个的格式非常不同:一个是@color/dark_grey,另一个是@layout/content_reminders。它们如此不同...第一个是如何知道要查找color.xml(以及在哪里)的?如果它们是@layout/content_reminders@values/color:dark_grey(或类似的东西),那么我会理解,因为有一些一致性(@path:[value])。但是像这样...实际格式是什么...? - Merc
如果res文件夹中的“一切”都被索引,那么是什么阻止我在那里添加一个layout2文件夹并引用它呢?(我的意思是,它确实不起作用,但为什么呢...?layoutvalues文件夹有特殊之处吗..?) - Merc
即使承认文件夹res/layoutres/values是特殊的,并以特殊方式处理它,但它如何知道当我键入@layout/content_reminder时,我不是在谈论文件res/values/layout.xml中的值content_reminder(而不是res/layout下的文件layout.xml... - Merc
我添加了一个问题...如果你愿意的话,请更新答案,以便所有内容都在一个地方! - Merc
是的,layoutcolorstring和其他标签都是特殊的。当您键入@layout/时,自动完成将显示所有layout文件。这个功能是在Android Studio中实现的。这些标签被IDE所理解,因此您不能引入新的标签。 - Henry
是否有一个包含所有“特殊”标签的列表? - Merc

-1

Android SDK 会为 res/values 文件夹下的每个文件生成一个唯一的整数值,该值在运行时用于查找特定资源。可以通过打开应用程序生成文件夹下的 R.java 文件来查看此文件


-1

不行不行不行,你不能使用@layout2/something_else。 编译器只会查找@layout。


-2
<include layout="@layout/a" />

鼠标放在 @layout/a 上时尝试按下 Alt+Insert 键;


正确理解问题。 - Apurva

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