【问题标题】:Android: How to inject a <string> element into another <string> element in XML?Android:如何将 <string> 元素注入 XML 中的另一个 <string> 元素?
【发布时间】:2010-09-15 22:36:27
【问题描述】:

我想知道是否有办法将 XML 文件中定义的 &lt;string&gt; 元素插入/注入到另一个 &lt;string&gt; 元素中,仅使用 XML 即可。

例如我可以:

<string name="author">Francesco</string>`

我正在寻找类似的东西:

<string name="about_application">Author: @string/author</string>`

这样getString(R.string.about_application) 会产生“作者:Francesco”。

我知道我可以在 Java 代码中使用 String.format(string, formatArgs)like 组合这两个元素,例如:

<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 中进行。

谁能给我一个建议?

【问题讨论】:

    标签: android xml string code-injection


    【解决方案1】:

    如果我了解您想要做什么,那么 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>
    

    【讨论】:

    • 谢谢!当我从同一文件中的 xml 元素引用内部实体时,它运行良好,而在引用另一个 xml 文件中定义的外部实体时遇到问题。无论如何,我不确定这种机制是否应该与Android /res/values/ xml文件一起使用,我认为它与Android“标准”管理它们的方式有点远。
    • 这就像间接之上的一个间接:-)。问题可能是在翻译 string.xml(其他文件夹中的副本)时,您忘记本地化 &auth;。此外,每次翻译仍然需要所有包含 &auth; 的字符串标签。然后。但是,是的,这是最好的,因为它必须是静态的(因此 xml 文件可以变成二进制文件)。
    【解决方案2】:

    不幸的是,我认为这是不可能的。不久前我问了similar question,并被告知这是不可能的。

    【讨论】:

    • 还是谢谢你!实际上我也认为没有标准的方法可以做到,即使 Mads Hansen 提出的“技巧”可以完成这项工作。
    【解决方案3】:

    Gradle 插件 0.10 带来了他们所谓的 ma​​nifestPlaceholders,它基本上可以满足您的需求,但此功能目前仅适用于 AndroidManifest。虽然有an issue opened targeting the next Android build version 1.41.3 目前处于 beta4 中,所以应该在 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" ]
                }
            }
    

    将替换以下声明中的占位符:

    &lt;activity android:name=".MainActivity"&gt; android:label="${activityLabel}" &gt;

    迫不及待想尝试一下。这样,您可以在字符串文件中多次出现占位符并仅在一个位置定义值,而不是修改所有 java 文件以添加带有 %1$s

    的参数

    目前唯一干净的解决方案是实体技巧,但如果您想覆盖风味中的值,这将不起作用,因为实体必须在同一个 xml 文件中定义。

    【讨论】:

      【解决方案4】:

      是的,有可能,我创建了这个小型库,允许您在构建时解析这些占位符,因此您无需添加任何 Java/Kotlin 代码即可使其工作。

      根据您的示例,您必须像这样设置字符串:

      <string name="template_about_application">Author: ${author}</string>
      

      然后插件将负责创建以下内容:

      <string name="about_application">Author: Francesco</string>
      

      更多信息在这里:https://github.com/LikeTheSalad/android-string-reference

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 2019-09-18
        • 2015-07-08
        • 1970-01-01
        • 2020-06-28
        • 2012-11-24
        • 2017-08-08
        相关资源
        最近更新 更多