字符串资源XML文件是否允许无效的Java变量作为名称属性?

时间:2014-06-10 12:22:39

标签: java android localization

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构建器会将其转换为“hello_world”。所以我问这个问题,找出我应该自动处理哪些情况以及应该允许哪些情况。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案是尽管名为“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程序构建项目来验证这些。 "." => "_"转换似乎是一次性的(虽然我只尝试了一些常见的标点符号,如上所示。


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