Table 1. Resource directories supported inside project res/ directory.

Directory Resource Type
animator/ Xml定义的属性动画
anim/ Xml文件定义的补间动画(属性动画也可以保存在这里,但优先选择animator/)
color/ 颜色集合.See Color State List Resource
drawable/

图片(.png, .9.png, .jpg, .gif)或者编辑成以下图片资源格式的Xml文件

  • Bitmap files
  • Nine-Patches (re-sizable bitmaps)
  • State lists
  • Shapes
  • Animation drawables
  • Other drawables

See Drawable Resources.

layout/ 布局文件
menu/ 菜单(选项菜单,上下文菜单,子菜单)
raw/ 保存任意文件的原始类型。通过Resources.getRawResource()指定的资源ID(R.raw.fileName),得到InputStream 也可以将文件放在assets文件加下,这可以保存多个层级的文件,并且是使用AssetManager通过文件名直接访问的,这里的文件不生成资源ID.
values/ Arrays.xml Colors.xml Dimens.xml Strings.xml styles.xml
xml/ 任意的xml文件,并且可以在运行期使用Resources.getXML().读取。 许多xml配置文件必须保存在这里,比如搜索配置。

注意:不能在res/目录下存放文件,否则会引起编译错误

##提供可选的资源 几乎所有的应用都应该提供备选资源来支持特定的设备配置。比如,你应该为不同的屏幕密度提供可选的绘图资源,为不同的语言提供可选的字符串资源。Android将检测当前的设备配置,为你的应用加载适当的资源。

步骤:

1.在res/下创建文件夹规则如下:<resources_name>-<config_qualifier>

  • <resources_name>为上表中文件的任意一种
  • <config_qualifier>的命名如下表所示。可以有多个<config_qualifier>用“-”隔开

注意:如果为同一类型文件夹追加限定符,那么必须按照表2的顺序排列,否则会被忽略

2.把资源保存各自的新路径下。资源的文件名必须与默认的资源文件名相当。

Android支持几种配置修饰语,你可以添加多个修饰语到同一个路径名,通过‘-’来分隔每一个修饰语。下表列举了可用的配置修饰语,考虑优先级,如果你为同一个资源路径使用了多个修饰语,你应该按照表中的列举的顺序添加。

Configuration Qualifier Values Description
MCC and MNC Examples:
mcc310
<nobr mcc310-mnc004 </nobr
mcc208-mnc00
etc.
移动手机国家区号(MCC),排在移动网络代码(MNC)之前。MNC来自设备的SIM卡。比如:mcc310表示美国,任何运营商;mcc310-mnc004表示美国Verizon;mcc208-mnc00表示法国Orange.
如果设备使用无线电连接(GSM手机),那么MCC和MNC的值来自于SIM卡。
你也可以只使用MCC(例如:你的应用中包含了某个指定国家的合法资源)。如果你只是需要指定不同的语言,那么请使用语言和区域修饰语(见下文)。如果你决定使用MCC和MNC修饰语,你应该仔细的做一些测试以保证其正常工作。
你也可以参与配置域mcc和mnc,他们分别指示了当前的移动手机国家区号和移动网络代码。
Language and region Examples:
en
fr
en-rUS
fr-rFR
fr-rCA
etc.
语言由两个ISO 639-1语言代码组成,后面可以跟着两个由<ISO 3166-1-alpha-2>定义的区域代码字母(前面加小写字母“r”)。
这些代码不区分大小写,前缀“r”是用来区分区域代码的部分。你不前单独使用区域代码。
在应用程序的运行生命周期中,如果用户更改了他的系统语言设定,这些设置可以被更改。详见运行时变化处理- Handling Runtime Changes,了解其在运行时将怎么样影响你的应用程序。
查看定位-Localization完整向导,了解怎样根据其他言语定位你的应用程序。
同样可见locale配置域,其指示了当前的定位。
Layout Direction ldrtl
ldltr
Ldrtl(layout-direction-right-to-left:布局方向从右向左) Ldltr(布局方向从左向右) 可以应用于layouts,drawables,values
注意:如果想让你的应用可以使用right-to-left的布局,必须设置 supportsRtl为true,并且targetSdkVersion 至少17以上
smallestWidth sw<N>dp

Examples:
sw320dp
sw600dp
sw720dp
etc.
屏幕的最小宽度是固定的,并不会随屏幕的方向改变而改变。 最小宽度的计算会考虑到系统界面的占用。比如,设备上沿着最小宽度轴线有些持久的UI元素,那么最小宽度要比实际的屏幕尺寸要小。因为,那些持久的UI元素,不属于你的应用,
  • 320, for devices with screen configurations such as:
    • 240x320 ldpi (QVGA handset)
    • 320x480 mdpi (handset)
    • 480x800 hdpi (high-density handset)
  • 480, for screens such as 480x800 mdpi (tablet/handset).
  • 600, for screens such as 600x1024 mdpi (7" tablet).
  • 720, for screens such as 720x1280 mdpi (10" tablet).
当提供多种最小宽度的数值时,系统会挑选数值最接近的(向下兼容,不超过) Api13以上 android:requiresSmallestWidthDp
Available width w<N>dp

Examples:
w720dp
w1024dp
etc.
指定最小的屏幕宽度,配置会随屏幕的方向改变。 当提供多种数值时,系统会挑选数值最接近的(向下兼容,不超过) 此数值不包含系统持久的UI元素,所以要比屏幕的实际数值小。
Api13以上 screenWidthDp
Available height h<N>dp

Examples:
h720dp
h1024dp
etc.
原理同上
Api13之上
screenHeightDp
Screen size small
normal
large
xlarge
small:类似于低密度的QVGA屏幕的尺寸。小屏幕的最小布局尺寸约为320x426 dp。如QVGA低密度和VGA高密度。
normal:类似于中等密度的HVGA屏幕尺寸。一般屏幕的最小布局尺寸约340x470 dp。如WQVGA低密度,HVGA中等密度,WVGA高密度。
large:类似于中等密度的VGA屏幕尺寸。大屏幕的最小布局尺寸约480x640 dp。如中等密度的VGA和WVGA屏幕。
xlarge:那些比传统中等密度HVGA更大的屏幕。加大屏幕的最小布局尺寸约720x960 dp。大多数情况下,加大屏幕的设备因为屏幕过大而无法放放口袋,一般为平板电脑类的设备。在API level 9中加入。
注意:如果使用的限定符超出了现在的屏幕,那么系统不会使用它们,并且会崩溃。比如,将资源文件标记为xlarge,但设备是normal-size的情况下。
Screen aspect long
notlong
long: 长屏幕, 如:WQVGA, WVGA, FWVGA
notlong: 非长屏幕,如:QVGA, HVGA, and VGA
在API level 4中加入。
这个主要是基于屏幕的比例(“长”屏幕更宽一些)。和屏幕的方向无关。
Screen orientation port
land
  • port: Device is in portrait orientation (vertical)
  • land: Device is in landscape orientation (horizontal)

在应用程序的生命周期中这个配置会随着用户旋转屏幕而发生改变。详见处理运行时的变化,了解其在运行时将怎么样影响你的应用程序。

UI mode car
desk
television
appliance watch
  • car: Device is displaying in a car dock
  • desk: Device is displaying in a desk dock
  • television: Device is displaying on a television, providing a "ten foot" experience where its UI is on a large screen that the user is far away from, primarily oriented around DPAD or other non-pointer interaction
  • appliance: Device is serving as an appliance, with no display
  • watch: Device has a display and is worn on the wrist

Added in API level 8, television added in API 13, watch added in API 20.

For information about how your app can respond when the device is inserted into or removed from a dock, read Determining and Monitoring the Docking State and Type.

This can change during the life of your application if the user places the device in a dock. You can enable or disable some of these modes using UiModeManager. See Handling Runtime Changes for information about how this affects your application during runtime.

Night mode night
notnight
会根据时间进行改变, 通过UiModeManager可以开启关闭此功能
Screen pixel density (dpi) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
120dpi.
160dpi.
240dpi.
320dpi
屏幕介于mdpi和hdpi,近似为213dpi
四个主要密度的比为:3:4:6:8,因此可按此比例设置图片的大小。
Touchscreen type notouch
finger
notouch: 设备不支持触屏。
finger: 设备有一个触摸屏。
Keyboard availability keysexposed
keyshidden
keyssoft
  • keysexposed:设备有一个可用键盘。如果设备有一个软键盘可用,这个配置也可用,即使是物理键盘没有暴露给用户,甚至设置没有物理键盘。如果没有软键盘盘如是被禁用,那个这配置只有在有物理键盘被暴露时可用。
  • keyshidden: 设备有一个物理键盘可用,但被隐藏了,且没有软键盘。
  • keyssoft: 设备有一个软键盘可以,不管其是否可见

如果你提供了一个keysexposed资源,但没有keyssoft资源,系统将使用keysexposed资源,而不考虑键盘是否可见,如果系统有一个软键盘可用。

在应用程序的生命周期中这个配置会因用户打开一个物理键盘而发生改变。

Primary text input method
首选文本输入方法
nokeys
qwerty
12key
  • nokeys: 设备没有物理键用作文本输入。
  • qwerty: 设备有一个物理的 qwerty 键盘,不管其是否对用户可见。
  • 12key: 设备有一个物理的 12-key 键盘,不管其是否对用户可见。

Also see the keyboard configuration field, which indicates the primary text input method available.

Platform Version (API level) Examples:
v3
v4
v7
etc.
设备支持的Api版本

###规则

  • 可以追加多个限定符,用破折号分开
  • 必须按照表二的顺序添加
  • 资源文件不能嵌套,只能有一层目录结构
  • 值是不区分大小写的,为避免在不区分大小写的系统中出现问题,资源编译器会将目录名转换为小写。名字中出现的任意大写字母只是为了增加可读性。

###创建别名资源 当你想在不同的系统配置下使用一份资源的时候,你不必把资源放在不同的资源文件夹下。你可以创建一个别名资源。

注意:animation,menu,raw和其他未指定的处于xml/文件夹下的资源不支持此功能。

假如你有一个名为icon.png的应用图标,需要为不同的区域提供不同的图标。但是,有两个区域使用的是同一张图标。这时你可能会将图标拷贝一份放到不同的文件夹下。然而,这不是必须的。我们可以将这两个区域用到的图标命名为icom_ca.png(任意不为icon.png的名称),保存在res/drawable/文件夹下。然后创建一个使用元素引用icon_ca.png图标的icon.xml文件,分别置于对应的两个区域的文件夹下。这样就可以只保存一个png文件,节省空间。

####Drawable 为图片创建别名资源,如下所示

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
 	android:src="@drawable/icon_ca" />

####Layout 为布局创建别名,

<?xml version="1.0" encoding="utf-8"?>
<merge>
 	<include layout="@layout/main_ltr"/>
</merge>

####字符串和其他基本资源

<?xml version="1.0" encoding="utf-8"?>
<resources>
 	<string name="hello">Hello</string>
 	<string name="hi">@string/hello</string>
</resources>

##提供最好的设备兼容资源 在提供不同适配资源的时候,最好保留一个默认的,比如values/,layout/,这样即使没有合适的资源匹配当前的系统,也不会出现系统崩溃的情况。

提供默认资源是很重要的,不仅是因为你的应用可能会跑在你没有预料到的配置上,还因为新版的Android有时会提出新的限定符,而旧版本不支持。例如,你的应用提供两种drawable资源,一种是night,一种notnight(Api8加入的夜间模式功能),但应用却运行在了Api版本为4的机器上,那么程序就会崩溃。我们可以将drawable作为我们的默认资源(notnight),drawable-night作为夜间模式资源。

###安卓系统是怎么寻找最佳资源的

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

假设设备的配置如下:

Locale = en-GB
Screen orientation = port
Screen pixel density = hdpi
Touchscreen type = notouch
Primary text input method = 12key

通过系统配置和资源文件的比较,安卓系统从drawable-en-port下获取图片。

系统运用如下逻辑来选择资源:

1.排除不符合设备配置的资源

首先排除不符合en区域的。

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

例外:屏幕的像素密度不会被排除

2.从表二中,按照顺序向下(从MMC开始)。

3.那些资源目录包含此限定符?

  • 如果不包含,就回到第二步,继续查找
  • 如果有,就到第四步

4.排除不包含此限定符的资源文件,

drawable/
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

5.继续2、3、4步骤,直到只剩下一个文件夹。

drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
资源匹配过程

对于屏幕尺寸的限定符,如果没有合适的资源,那么会向下兼容。例如,大尺寸的屏幕在没有合适资源的时候会使用normal-size的资源,但是,如果设备是normal-size的,而只有large-size的资源,系统就不会选择使用这个资源,而会崩溃。

注意:优先级要远比匹配的上的数量重要,比如上边的例子,虽然drawable-port-notouch-12key 资源文件有三个限定符符合当前系统配置,但drawable-en只匹配了一个限定符,但是en限定符有更高的优先级,所以,drawable-port-notouch-12key文件先于drawable-en文件被排除。

###要知道的问题 Android 1.5 and 1.6对资源文件的要求是完全匹配。也就是说,不会出现向下兼容的情况,必须严格的匹配才行

评论