Android 自定义XML资源中的引用字符串资源
在我的Android应用程序项目的Android 自定义XML资源中的引用字符串资源,android,xml,android-resources,Android,Xml,Android Resources,在我的Android应用程序项目的assets文件夹中,我存储了描述游戏中动作的自定义XML文件。因为它们有点复杂,所以不能直接编写为Android资源 更新:我现在将自定义(复杂)XML文件存储在res/XML文件夹中 简单的例子: <dialog> <npc>1</npc> <text>Hello! How are you?</text> </dialog> 我不想创建不同语言的res/xml文件夹,在
assets
文件夹中,我存储了描述游戏中动作的自定义XML文件。因为它们有点复杂,所以不能直接编写为Android资源
更新:我现在将自定义(复杂)XML文件存储在res/XML
文件夹中
简单的例子:
<dialog>
<npc>1</npc>
<text>Hello! How are you?</text>
</dialog>
我不想创建不同语言的res/xml
文件夹,在那里复制所有xml文件并完全翻译它们。我只想翻译其中的一部分。通过引用字符串资源,可以很容易地实现
更新2:我现在发现,您从Resource.getXml()
获取的XMLParser有一个名为getAttributeResourceValue()
的方法,它会自动将类似randomAtt=“@string/random\u string”
的属性转换为实际的资源ID。但是,在XML文件中,仍然没有明确的依赖关系,并且在输入无效资源时,字符串也没有预览或警告。但是,由于甚至有一种方法可以实现这一点,我坚信可以让验证器只允许某些自定义属性中的字符串资源。好的,所以在过去两个小时的大量研究之后,我终于找到了一个非常有效的解决方案。我已经看到一些线程提出了非常类似的问题——这就是为什么我相信这个答案可能会在将来帮助一些程序员 要求:
我的任务要求如下:使用自己的模式引用自定义XML文件中的字符串资源,该模式存储在
res/XML
目录中。Android Studio的XML验证器应自动将其检测为字符串资源,在无效时打印警告,并在有效资源时预览实际字符串。此外,它还应该尽可能地发挥作用
解决方案:我就是这样解决的:
我没有将字符串资源放在标记之间,而是将它们作为属性。对我来说没什么大不了的。
为了让验证器将它们识别为字符串资源,我必须从
android
名称空间调用这些属性text
:
更新:我发现您可以随意调用该属性,并且不需要包含android名称空间
<main>
<nested>
<test myText="@string/lorem_ipsum_100"/>
</nested>
</main>
性能说明:据我所知,这个解决方案的性能也非常好,因为android会自动将
@string/..
预解析为资源ID 如果它有可本地化的字符串,为什么要将其存储为资产?最好将它们存储在资源下的xml目录中,而不是资产下。因为资源文件夹中的所有xml文件都需要遵循特定的Android结构。对于某些任务,我需要具有自己模式的更复杂的XML文件。这在res
中是不允许的。根据Android文档,您可以在resources下创建一个目录“xml”,并在那里存储任意xml。你探索过这个选择吗?你在使用这种方法时有没有遇到任何限制?啊,哇,我怎么没有注意到!非常感谢。尽管如此,问题仍然存在:我现在如何从其中引用字符串?我试着在一个自定义的文本标记中键入@string/
,但是没有自动完成,所以我认为它不可引用。多亏了@greenrobo,我更新了第一篇帖子。尽管如此,我现在仍然不知道如何在自定义xml资源文件中引用字符串资源。有没有办法让android在不在属性值中但在两个xml标记之间时也预解析引用?
<main>
<nested>
<test myText="@string/lorem_ipsum_100"/>
</nested>
</main>
XmlResourceParser parser = getResources().getXml(R.xml.tutorial_welcome_dialog);
try {
while (parser.next() != XmlPullParser.END_DOCUMENT) {
if (parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("test")) {
String s;
for (int i = 0; i < parser.getAttributeCount(); i++) {
if (parser.getAttributeName(i).equals("text"))
s = getResources().getString(parser.getAttributeResourceValue(i, -1));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}