Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串资源XML文件是否允许无效的Java变量作为名称属性?_Java_Android_Localization - Fatal编程技术网

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

字符串资源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=

显示一个示例字符串,该字符串也是一个有效的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="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
}