我想知道是否有办法将XML文件中定义的<string>
元素插入/注入另一个<string>
元素,只使用XML执行此操作。
例如我可以:
<string name="author">Francesco</string>`
我正在寻找类似的东西:
<string name="about_application">Author: @string/author</string>`
这样getString(R.string.about_application)
会导致“作者:Francesco”。
我知道我可以使用String.format(string, formatArgs)
组合Java代码中的两个元素,例如:
<string name="author">Francesco</string>
<string name="about_application">Author: %1$s</string>`
然后在代码中使用
String.format(getString(R.string.about_application), getString(R.string.author))
但我想直接用XML来做。
有人可以建议我这样做吗?
答案 0 :(得分:15)
如果我了解您的目标,那么 internal (parsed) general entities 可能会帮助您实现所需目标。
如何将值“Francesco”定义为名为“auth”的实体,然后在XML中使用它的示例:
<?xml version="1.0"?>
<!DOCTYPE doc [
<!ENTITY auth "Francesco">
]>
<doc>
<string name="author">&auth;</string>
<string name="about_application">Author: &auth;</string>
</doc>
当XML解析器读取时,文档将被解析和评估,或“看到”,如下:
<?xml version="1.0"?>
<doc>
<string name="author">Francesco</string>
<string name="about_application">Author: Francesco</string>
</doc>
答案 1 :(得分:1)
不幸的是,我不认为这是可能的。我前一段时间问similar question,并被告知这是不可能的。
答案 2 :(得分:0)
Gradle插件0.10带来了他们所谓的 manifestPlaceholders ,它基本上可以满足您的需求,但此功能目前仅适用于AndroidManifest。虽然an issue opened targeting the next Android build version 1.4( 1.3目前处于测试阶段4,因此应该在RC1附近,很快就会看到1.4 beta1)。
此问题应扩展xml配置文件中的占位符(我只是祈祷这将包括字符串文件,而不仅仅是基本的xml配置)。
来自:http://tools.android.com/tech-docs/new-build-system
对于自定义占位符替换,请使用以下DSL 配置占位符值:
android {
defaultConfig {
manifestPlaceholders = [ activityLabel:"defaultName"]
}
productFlavors {
free {
}
pro {
manifestPlaceholders = [ activityLabel:"proName" ]
}
}
将在以下声明中替换占位符:
<activity android:name=".MainActivity"> android:label="${activityLabel}" >
无法等待尝试。通过这种方式,您可以在字符串文件中多次出现占位符,并仅在一个位置定义值,而不是修改所有java文件以添加带有%1 $ s的参数
现在唯一干净的解决方案虽然是实体技巧,但如果你想覆盖flavor中的值,这将无效,因为实体必须在同一个xml文件中定义。
答案 3 :(得分:0)
是的,有可能,我创建了这个小库,使您可以在构建时解析这些占位符,因此您无需添加任何Java / Kotlin代码即可使其工作。
根据您的示例,您必须像这样设置字符串:
<string name="template_about_application">Author: ${author}</string>
然后该插件将负责创建以下内容:
<string name="about_application">Author: Francesco</string>
此处有更多信息:https://github.com/LikeTheSalad/android-string-reference