【发布时间】:2018-11-28 17:55:31
【问题描述】:
我正在按照这个解决方案在我的字符串资源文件中使用 enetities:
Is it possible to do string substitution in Android resource XML files directly?
我在资源树中使用了一个外部文件:/res/raw/entities.dtd,它的内容:
<!ENTITY ent_devicename "MyDeviceName">
在string.xml资源文件中:
<!DOCTYPE resources [
<!ENTITY % ent_devicename SYSTEM "../raw/entities.dtd">
%ent_devicename;
]>
<resources>
<string name="name">The name is &ent_devicename;</string>
</resources>
但我收到此错误:
实体“ent_devicename”已被引用,但未声明。
如您所见,Android Studio 可以识别外部实体文件:
和实体:
有人可以提供完整的正确示例来使事情正常进行吗? 我的意思是一个完全可编译的 Android Studio 项目,实体声明在一个单独的文件中。
更新 好的,如果你多关注这个 w3schools 链接:
https://www.w3schools.com/xml/xml_dtd_entities.asp
你看到了解决方案:
外部entities.dtd 文件包含
<!ENTITY ent_devicename "MyDeviceName">
然后是新的字符串资源资源:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY ent_devicename SYSTEM "../raw/entities.dtd">
]>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="Typos">
<string name="ent_devicenamxxe2">&ent_devicename;</string>
我将 <!ENTITY % ent_devicename 更改为 <!ENTITY ent_devicename(不再有 %)
我删除了%ent_devicename;
现在它可以编译,但生成的 APK 似乎忽略了实体值(使用空字符串)。所以问题没有解决!
告诉我!
【问题讨论】:
-
@VicJordan 所需的两个 XML 文件(strings.xml 和entities.dtd)已发布在问题中。没有其他相关文件。
-
对外部参数实体
%ent_devicename;和内部实体&ent_devicename;使用相同的名称是自找麻烦。改变一个或另一个(在定义和使用上保持一致),看看你的问题是否不会消失。 -
@kjhughes 我重命名了外部文件中的实体名称 但问题仍然存在。
-
@kjhughes 我用一些技巧来解决这个问题,现在它可以编译,但生成的字符串资源具有空实体值。
-
您的更新会从字面上读取
../raw/entities.dtd的内容并将它们放在您引用&ent_devicename;的位置——这可能不是您想要的。有关更详细的帮助,请参阅my answer below。谢谢。
标签: xml android-studio android-gradle-plugin android-resources dtd