12.3 建立别名资源

如果有多个不同配置的设备要使用同样的资源(例如,英语和法语使用同一个音频资源,而中文和俄语使用另外一个音频资源),通常的做法是将资源文件复制到每一个带配置标识符的资源目录中,这样做可能会导致apk文件过大(这些资源可能是大的图像、音频、视频文件)。但利用别名资源,可以使这些资源文件只保留一份,并且可以在任何其他资源目录中引用。

建立别名资源需要做如下两件事。

在默认的资源目录中放一份资源文件。

在要引用该资源的资源目录中建立一个XML文件,并根据不同资源使用相应的标签来引用默认资源目录中的资源。

下面来看看如何建立几种常用资源的别名资源。

12.3.1 图像别名资源

假设drawable-zh、drawable-en、drawable-fr三个资源目录都需要使用一个face.png图像文件,现在先将face.png放到drawable目录(默认的图像资源目录),并将其改名(除了face.png,叫什么都可以),如改成face_alias.png。然后在drawable-zh、drawable-en和drawable-fr三个目录中各建立一个face.xml文件,并输入如下的内容。

<?xml version="1.0" encoding="utf-8"?>

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"

  android:src="@drawable/face_alias" />

现在改变手机的配置,例如,将手机和语言环境改为英文。代码中使用的R.drawable.face资源实际上引用了face_alias.png。

12.3.2 布局别名资源

布局别名资源与图像别名资源建立文件的方法类似,只是xml文件的内容不同。假设在res/layout目录中有一个main_alias.xml布局文件,如果想在layout-zh和layout-en两个目录引用main_alias.xml,可以在这两个目录中分别建立一个main.xml文件,并输入如下的内容。

<?xml version="1.0" encoding="utf-8"?>

<merge>

  <include layout="@layout/main_alias"/>

</merge>

在中文和英文环境中引用R.layout.main,实际上是使用了main_alias.xml文件。

12.3.3 字符串别名资源

字符串别名资源相对简单一些,只需要在资源文件中使用资源ID引用字符串资源文件即可。例如,下面的hi字符串资源就是hello字符串资源的别名。

<?xml version="1.0" encoding="utf-8"?>

<resources>

  <string name="hello">Hello</string>

  <string name="hi">@string/hello</string>

</resources>

12.3.4 其他简单值别名资源

其他简单值资源(如颜色、维度等)和字符串资源类似,别名就是引用资源的ID。例如,颜色别名资源的代码如下:

<?xml version="1.0" encoding="utf-8"?>

<resources>

  <color name="yellow">#f00</color>

  <!-- highlight是red的别名 -->

<color name="highlight">@color/red</color>

</resources>