Android:如何将<string>元素注入XML中的另一个<string>元素?</string> </string>

时间:2010-09-15 22:36:28

标签: android xml string code-injection

我想知道是否有办法将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来做。

有人可以建议我这样做吗?

4 个答案:

答案 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