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”。所以我问这个问题,找出我应该自动处理哪些情况以及应该允许哪些情况。
答案 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格式和构建过程会自动转换为“。”增加关键碰撞风险的符号。