8.3.2 字符串和常量
在应用开发中,经常需要定义常量,以提升这些只读信息的可读性和复用性。在Android中,如果一个常量与界面上的元素相关,通常不在代码中声明,而是在资源文件中定义。
将界面相关的常量信息通过资源文件来描述,有两个好处。
(1)可以被其他资源引用。比如,如果期望在控件中使用同一背景色,那么将该颜色信息在资源文件中定义,进而被其他资源文件使用。
(2)可以根据软硬件环境进行适配。比如,如果应用需要支持多种语言版本,那么要将不同语言版本的字符串信息在资源文件中进行定义,通过资源的可适配性进行动态配置。
在Android中,字符串、颜色、数组等常量信息的定义都放在values目录下(样式信息也是一种常量)。在资源文件中,所有常量定义都放在<resources>元素下,每类常量都有与之对应的XML元素,示例如下[1]:
<?xml version="1.0"encoding="utf-8"?>
<resources>
<!—维度常量,定义一个长度,单位可以是dp、sp,等—>
<dimen name="sample_dimen">100dp</dimen>
<!—字符串常量—>
<string name="sample_string">字符常量</string>
<!—颜色常量,格式可以是#AARRGGBB、#ARGB、#RGB,等—>
<color name="sample_color">#ffffff</color>
<!—数组常量,可以定义字符、整型等多种数组—>
<integer-array name="sample_array">
<item>1</item>
<item>2</item>
</integer-array>
</resources>
开发者可以将资源常量信息放在value目录下的任一XML资源文件中。但为了更好地管理和查看这些字符和常量定义,在实际开发中,通常将不同类型的常量信息放在不同的资源文件中。比如,字符资源通常放在strings.xml中,颜色定义放在colors.xml内,数组的定义则放在array.xml中。
当然,在有些情况下,开发者也会按照常量值的内容特点而不是类型进行组织。比如,在Android原生的联系人应用中,有一个名为donottranslate_config.xml的资源文件,顾名思义,该文件中放置的资源常量信息和本地化无关,但和其他设备环境的配置信息相关。这是一个典型的按照内容特点来组织的资源文件,该文件包含各种类型的常量:
<?xml version="1.0"encoding="utf-8"?>
<resources>
<!—定义界面的样式模式,在默认屏幕尺寸下使用单栏的样式,布尔类型—>
<bool name="config_use_two_panes">false</bool>
<!—默认的文件导出路径,字符串类型—>
<string name="config_export_dir"
translatable="false">/mnt/sdcard</string>
<!—应用图标的缩放比例,自定义的图标类型—>
<item name="tab_width_screen_width_percentage"type="fraction">75%</item>
<item name="tab_height_screen_width_percentage"type="fraction">50%</item>
…
</resources>
在大屏幕的设备上(适配项是values-sw580dp,表示最小宽度大于580dp的设备),donottranslate_config.xml中定义的资源常量,会有部分值被重新设定:
<?xml version="1.0"encoding="utf-8"?>
<resources>
<!—在大尺寸屏幕上,使用双栏的界面模式—>
<bool name="config_use_two_panes">true</bool>
<!—在大尺寸屏幕上,应用图标的缩放成方形—>
<item name="tab_width_screen_width_percentage"type="fraction">66%</item>
<item name="tab_height_screen_width_percentage"type="fraction">66%</item>
…
</resources>
在实际项目中,开发者可以综合上述两种方式来定义和组织资源常量,使其可以更好地被维护和修改。
[1]字符串以及字符串数组的定义参见:androidappdocs.appspot.com/guide/topics/resources/string-resources.html,其他常量的定义参见:androidappdocs.appspot.com/guide/topics/resources/more-resources.html。