Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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 自定义XML资源中的引用字符串资源_Android_Xml_Android Resources - Fatal编程技术网

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

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文件夹,在

在我的Android应用程序项目的
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();
}