字符串资源XML文件是否允许无效的Java变量作为名称属性?
显示一个示例字符串,该字符串也是一个有效的Java变量(“hello\u world”),它解释了如何通过字符串资源XML文件是否允许无效的Java变量作为名称属性?,java,android,localization,Java,Android,Localization,显示一个示例字符串,该字符串也是一个有效的Java变量(“hello\u world”),它解释了如何通过R.string.hello\u world 我的问题是XML是否允许包含无效的字符串名属性作为Java变量。例如,是否允许以下字符串键作为XML资源名称,如果允许,如何在Java中通过R.string.访问它们 <string name="hello world" /> <string name="hello.world" /> <string name=
R.string.hello\u world
我的问题是XML是否允许包含无效的字符串名属性作为Java变量。例如,是否允许以下字符串键作为XML资源名称,如果允许,如何在Java中通过R.string.
访问它们
<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文件并生成静态类R,为了进行编译,该类必须包含有效的成员名称 我回答我自己的问题是因为尽管这里关于最佳实践的建议是有效的,但我问的不是最佳实践 答案是,尽管名为“hello.world”的字符串将是一个无效的Java变量,但它在XML中是允许的,因为构建过程会自动将
“
符号转换为下划线,然后再成为Java类成员变量
以下字符串:
<string name="foo_bar"> .. </string>
<string name="foo.baz"> .. </string>
<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 foo_bar=0x7f0a000f; // <- valid
public static final int foo_baz=0x7f0a0010; // <- valid (CONVERTED)
}
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
}
公共静态最终类字符串{
public static final int foo_bar=0x7f0a000f;//这里真正的问题是:“为什么要这样做?”我可以清楚地看到,这不是一个好的做法。你已经得出了一个结论,认为想要实现的目标是错误的。我已经用一些上下文更新了我的问题,以了解我实际想要实现的目标。我想你可能仍然缺少一些上下文。你的用户与xml属性有什么关系?是应用程序的用户还是库的用户?它是应用程序-一个文件格式转换器。我引用的XML属性是字符串元素
中的“name”属性,我错误地键入了“key”在我的问题中,我现在已经解决了,现在它更有意义了。如果正确转义,您的XML属性可以包含任何有效的UTF-8。现在,如果您的用户使用该XML并尝试将其用作strings.XML,那么Android builder会咳嗽或对其感兴趣。这是没有办法的。我的软件用户告诉我“x.y”将自动转换为“x_y”。他们错了吗?在安装Android Studio并构建上述示例后,我可以确认在生成的Java类中,以点分隔的键被转换为下划线。·可能是Android Studio的一项功能,但无论如何,他们的说法都没有错。不,这不是AndroidStudio。可能是ADT负责这种转换。键中的空格或以数字开头的键导致编译时错误是的s将是一次性转换。我无法识别任何其他转换。转换还可能导致密钥冲突,这使得它成为一个异常烦人的“功能”,例如,如果您声明my_key和my.key
<string name="foo bar"> .. </string>
<string name="foo-baz"> .. </string>
<string name="42foo"> .. </string>
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
}