【问题标题】:Do string resource XML files allow invalid Java variables as name attributes?字符串资源 XML 文件是否允许无效的 Java 变量作为名称属性?
【发布时间】:2014-06-11 18:46:49
【问题描述】:

Android developer docs for string resources 显示了一个示例字符串,它也是一个有效的 Java 变量(“hello_world”),它解释说可以通过R.string.hello_world 访问

我的问题是是否允许 XML 包含 无效 作为 Java 变量的字符串名称属性。例如,以下字符串键是否允许作为 XML 资源名称,如果允许,如何通过 Java 中的R.string.<name> 访问它们?

<string name="hello world" />

<string name="hello.world" />

<string name="42 hello world" />

反对者请注意:我并没有真正尝试这样做。我正在尝试了解文件格式允许什么以及如何转换资源。

我要问的内容和原因的一些背景:

我的软件将键/值对转换为 XML 资源,并自动将所有键转换为有效的 Java 变量,因此“hello-world”被转换为“hello_world”。然而,一位用户报告说他们希望保留“hello.world”作为 XML 名称属性的值。他们告诉我,Android builder 会将其转换为“hello_world”。所以我问这个问题是为了弄清楚哪些情况我应该自动处理,哪些情况应该允许通过。

【问题讨论】:

  • 这里真正的问题是:“你为什么想要这样做?”
  • 我可以清楚地看到这不是好的做法。你已经得出一个想要达到的结论是错误的。我已经根据我实际想要实现的目标更新了我的问题。
  • 我想您可能仍然缺少一些上下文。您的用户与 xml 属性有什么关系?它是应用程序的用户,还是库的用户?
  • 它是一个应用程序 - 一个文件格式转换器。我引用的 XML 属性是字符串元素 &lt;string name=".."&gt; 中的“名称”属性我在我的问题中错误地输入了“键”,现在我已经修复了
  • 现在更有意义了。如果转义正确,您的 XML 属性可以包含任何有效的 UTF-8。现在,如果您的用户使用该 xml 并尝试将其用作 strings.xml,那么 Android 构建器将会咳嗽或从中获得一些乐趣。没有办法解决这个问题。

标签: java android localization


【解决方案1】:

这是不可能的。解析 XML 文件并生成静态类 R,为了编译,该类必须包含有效的成员名称。

【讨论】:

  • 我的软件用户告诉我,“x.y”将自动​​转换为“x_y”。他们错了吗?
  • 安装 Android Studio 并构建上述示例后,我可以确认“.”在生成的 Java 类中,点分隔键中的下划线被转换为下划线。 ·也许是Android Studio的一个特性,但不管怎样,他们的说法都没错。
  • 不,它不是 AndroidStudio。可能是 ADT 负责这种转换。键中的静止空间,或以数字开头的键会导致编译时错误
  • 是的,这似乎是一次性转换。我无法识别任何其他人。转换还可能导致密钥冲突,这使其成为一个非常烦人的“功能”
  • 是的,例如您声明 my_key 和 my.key
【解决方案2】:

我正在回答我自己的问题,因为虽然这里关于最佳实践的建议是有效的,但我询问的并不是最佳实践。

答案是,尽管名为“hello.world”的字符串将是无效的 Java 变量,但它在 XML 中是允许的,因为构建过程会自动将 "." 符号转换为 下划线在它成为Java类成员变量之前。

以下字符串:

<string name="foo_bar"> .. </string>
<string name="foo.baz"> .. </string>

将在 R.java 中产生(无论是由于功能还是错误)成员如下:

public static final class string {
    public static final int foo_bar=0x7f0a000f; // <- valid
    public static final int foo_baz=0x7f0a0010; // <- valid (CONVERTED)
}

以下两个字符串:

<string name="foo_bar"> .. </string>
<string name="foo.bar"> .. </string>

将导致冲突,构建过程将失败:

public static final class string {
    public static final int foo_bar=0x7f0a000f; // <- valid
    public static final int foo_bar=0x7f0a0010; // <- DUPLICATE
}

以下字符串:

<string name="foo bar"> .. </string>
<string name="foo-baz"> .. </string>
<string name="42foo"> .. </string>

将破坏构建过程,在 R.java 中产生无效成员,如下所示:

public static final class string {
    public static final int 42foo=0x7f0a0000;   // <- invalid
    public static final int foo bar=0x7f0a000f; // <- invalid
    public static final int foo-baz=0x7f0a0010; // <- invalid
}

我通过 Android Studio 以及命令行 Gradle 程序构建了一个项目来验证这些。 "." =&gt; "_" 转换似乎是一次性的(尽管我只尝试了一些常见的标点符号,如上所示。


TL;DR
名称应该是有效的 Java 变量,但 XML 格式和构建过程会自动转换为“.”。增加键碰撞风险的符号。

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 2021-11-29
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多