自定义XML资源中的引用字符串资源

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资源,我不得不textandroid命名空间调用这些属性: 更新:我发现你可以随意调用该属性,并且没有必要包含android命名空间.

<main>
    <nested>
        <test myText="@string/lorem_ipsum_100"/>
    </nested>
</main>
Run Code Online (Sandbox Code Playgroud)

(您的自定义XML可能看起来像您喜欢/需要的任何东西!这只是一个示例 - 它适用于无限制的嵌套标记和您自己定义的模式.)

我不认为这会起作用 - 但实际上它确实很好!每当我点击时Build project,它会在我使用无效的String资源时打印出警告.
不仅如此,它还根据需要进行预览: Android Studio中的字符串预览

(注意:这个截图是在我注意到你可以随意调用属性之前制作的.没有必要明确地调用它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.