Tob*_*ter 4 xml android android-resources
在assets我的Android App Project 的文件夹中,我存储了描述游戏中动作的自定义XML文件.由于它们稍微复杂一些,因此无法直接编写为Android资源.
更新:我现在将自定义(复杂)XML文件存储在res/xml文件夹中.
简单示例:
<dialog>
<npc>1</npc>
<text>Hello! How are you?</text>
</dialog>
Run Code Online (Sandbox Code Playgroud)
我想要的是利用Android String资源的方便优势进行语言本地化.在上面的例子中,我想保存Hello! How are you?在我的res/values/strings.xml,然后以某种方式引用它:
<text>@string/dialog_1_text</text>
Run Code Online (Sandbox Code Playgroud)
我不希望创建不同语言res/xml的文件夹,我复制所有的XML文件,并将其完全翻译.我只想要翻译部分内容.通过引用String资源轻松实现.
更新2:我现在发现,您获得的XMLParser Resource.getXml()有一个方法getAttributeResourceValue(),该方法将randomAtt="@string/random_string"自动属性转换为实际的资源ID.
但是,在XML文件中,仍然没有明确的依赖关系,并且在放入无效资源时没有预览字符串或警告.但是 - 因为甚至有一种方法 - 我坚信可以让验证器只允许某些自定义属性中的字符串资源.
Tob*_*ter 10
好的,经过过去两个小时的大量研究,我终于找到了一个非常好的解决方案.我已经看到一些线程提出了非常相似的问题 - 这就是为什么我确信这个答案可能会在将来帮助一些程序员.
要求:
我的任务要求如下:使用我自己的架构在自定义XML文件中引用字符串资源,存储在res/xml目录中.Android Studio的XML Validator应自动将其检测为String资源,在无效时打印警告 - 并在有效资源时预览实际的String.它也应该尽可能高效.
解决方案:
这就是我解决它的方式:我不得不
将字符串资源放在标签之间,而是将它们作为属性放置.在我的情况下没什么大不了的.
并且为了使验证器将它们识别为String资源,我不得不
更新:我发现你可以随意调用该属性,并且没有必要包含android命名空间.text从android命名空间调用这些属性:
<main>
<nested>
<test myText="@string/lorem_ipsum_100"/>
</nested>
</main>
Run Code Online (Sandbox Code Playgroud)
(您的自定义XML可能看起来像您喜欢/需要的任何东西!这只是一个示例 - 它适用于无限制的嵌套标记和您自己定义的模式.)
我不认为这会起作用 - 但实际上它确实很好!每当我点击时Build project,它会在我使用无效的String资源时打印出警告.
不仅如此,它还根据需要进行预览:

(注意:这个截图是在我注意到你可以随意调用属性之前制作的.没有必要明确地调用它android:text.只要你放了,Android Studio就会自动将它识别为字符串资源@string/....)
现在最后但并非最不重要的是,要让您的Java代码正确解释资源,您必须这样做:
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();
}
Run Code Online (Sandbox Code Playgroud)
性能说明:据我所知,此解决方案也具有超高性能,因为android会@string/...自动预分析为资源ID.