Resources
概览
提供资源
感悟
外部化应用资源,例如图像和代码中的字符串,这样有利于您单独维护这些资源。 此外,您还应该为特定设备配置提供备用资源,方法是将它们分组到专门命名的资源目录中。 在运行时,Android 会根据当前配置使用适当的资源。例如,您可能需要根据屏幕尺寸提供不同的 UI 布局,或者根据语言设置提供不同的字符串。
资源目录结构
在res/下的资源在项目R类中都有相应的资源ID。如需访问原始文件名和文件层次结构,则可以考虑将某些资源保存在 assets/ 目录下(而不是 res/raw/)。assets/ 中的文件没有资源 ID,因此您只能使用 AssetManager 读取这些文件。
备用资源
在创建备用资源目录,追加多个限定符时,一定要用短划线(-)隔开。并且一定要按照Providing Resources中表2描述的上下顺序来添加。如果限定符顺序错误,那么该资源将被忽略。
默认资源
要使应用支持多种设备配置,则务必为应用使用的每种资源类型提供默认资源,这一点非常重要。如果您将所有字符串放入带有语言和区域限定符的目录中,则在语言设置不支持您的字符串的设备上运行应用时,应用将会崩溃。 但是,只要提供默认 values/ 资源,应用就会正常运行(即使用户不理解该语言,这也总比崩溃要好)。
屏幕密度备用资源的适配原则
如果涉及的限定符是屏幕像素密度,则 Android 会选择最接近设备屏幕密度的选项。通常,Android 倾向于缩小大型原始图像,而不是放大小型原始图像。
屏幕尺寸备用资源的适配原则
根据屏幕尺寸限定符选择资源时,如果没有更好的匹配资源,则系统将使用专为小于当前屏幕的屏幕而设计的资源(例如,如有必要,大尺寸屏幕将使用标准尺寸的屏幕资源)。 但是,如果唯一可用的资源大于当前屏幕,则系统不会使用这些资源,并且如果没有其他资源与设备配置匹配,应用将会崩溃(例如,如果所有布局资源均用 xlarge 限定符标记,但设备是标准尺寸的屏幕)。
访问资源
感悟
资源类型
资源有两种类型, 一种是文件型, 比如drawable下的图片资源. 另一种是简单数值资源, 比如string类型。
资源id生成
编译应用时,aapt 会生成 R 类,其中包含您的 res/ 目录中所有资源的资源 ID。 每个资源类型都有对应的 R 子类(例如,R.drawable 对应于所有 Drawable 资源),而该类型的每个资源都有对应的静态整型数(例如,R.drawable.icon)。这个整型数就是可用来检索资源的资源 ID。
res/raw和assets/目录的区别:访问原始文件名和文件层次结构,则可以考虑将某些资源保存在 assets/ 目录下。而只是读取原始数据时,可以放在res/raw目录下。保存在 assets/ 目录中的文件“绝对没有”资源 ID,因此您无法通过 R 类或在 XML 中引用它们。您可以改为采用类似普通文件系统的方式查询 assets/ 目录中的文件,并利用 AssetManager 读取原始数据。不过,如需的只是读取原始数据(例如视频文件或音频文件)的能力,则可将文件保存在 res/raw/ 目录中,并利用 openRawResource() 读取字节流。
引用id的组成
- 资源类型
- 资源名称:它是不包括扩展名(类似.png)的文件名;或是 XML android:name 属性中的值,如果资源是简单值的话(例如字符串)。
在代码中访问资源
语法
[<package_name>.]R.<resource_type>.<resource_name>
- <package_name> 是资源所在包的名称(如果引用的资源来自您自己的资源包,则不需要)。
- <resource_type> 是资源类型的 R 子类。
- <resource_name> 是不带扩展名的资源文件名,或 XML 元素中的 android:name 属性值(如果资源是简单值)。
在 XML 中访问资源
语法
@[<package_name>:]<resource_type>/<resource_name>
- <package_name> 是资源所在包的名称(如果引用的资源来自同一包,则不需要)
- <resource_type> 是资源类型的 R 子类
- <resource_name> 是不带扩展名的资源文件名,或 XML 元素中的 android:name 属性值(如果资源是简单值)。
在XMl中访问平台资源
要引用系统资源,需要加入包名称:
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@android:color/secondary_text_dark"
android:text="@string/hello" />
在代码中访问平台资源
Android 包含许多标准资源,例如样式、风格主题和布局。要访问这些资源,请通过 android 包名称限定您的资源引用。例如,您可以将 Android 提供的布局资源用于 ListAdapter 中的列表项:
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
引用样式资源
您可以通过样式属性资源在当前应用的风格主题中引用某个属性的值。 通过引用样式属性,您可以不采用为 UI 元素提供硬编码值这种方式,而是通过为 UI 元素设置样式,使其匹配当前风格主题提供的标准变型来定制这些元素的外观。引用样式属性的实质作用是,“在当前风格主题中使用此属性定义的样式”。
语法
?[<package_name>:][<resource_type>/]<resource_name>
由于系统资源工具知道此环境中肯定存在某个属性资源,因此您无需显式声明类型— 您可以将 attr 类型排除在外。
注意
切勿手动修改 R.java 文件 — 它是在编译您的项目时由 aapt 工具生成的。您下次编译时所有更改都会被替代。
Resources
Resource类 : Android资源访问控制类, 该类提供了大量方法获取实际资源, Resource通过 Context.getResource()方法获得;
通过Resources.getter()获取资源
Resources类针对不同的资源提供了通过资源id获取资源的getter方法。我们可以获取Resources实例后调用这些方法来获取res/目录下的资源。
当我们需要访问文件原始数据时(res/raw目录下),我们需要调用Resources.openRawResource()方法。
简单数值资源注意点
分类资源文件 : 如果将所有的资源放到一个XML文件中, 会增加维护难度, 这里将不通类型的资源放到不同的XML文件下;
- arrays.xml : 存放数组资源;
- colors.xml : 存放颜色资源;
- dimens.xml : 存放尺寸值资源;
- strings.xml : 存放字符串资源;
- styles.xml : 存放样式资源;
- integer.xml : 存放整数资源;
- bool.xml : 存放布尔值资源;
res/value目录XML文件<resource>子标签解析 :
- string标签 : 代表一个字符串;
- integer标签 : 代表一个整数值标签;
- bool标签 : 代表一个boolean值;
- color标签 : 代表一个颜色值;
- array标签 : 代表数组;
- string-array标签 : 代表字符串数组;
- int-array标签 : 代表int数组;
- style标签 : 代表样式;
- dimen标签 : 代表一个尺寸;
color
三原色 : 白光 可以分解为 红, 绿, 蓝 三种颜色的光, 红绿蓝都是最大值的时候就是白色, 三种值相等, 但不是最大值是灰色, 如果其中一种或两种值比较大, 就会产生各种颜色的彩色;
颜色表示 : 颜色通过 红(red) 绿(green) 蓝(blue) 三种颜色, 以及 透明度(alpha) 来表示的;
- 颜色开头 : 颜色值总是以 # 开头;
- 无透明度 : 如果没有 alpha 值, 默认完全不透明;
颜色定义形式 :
- #RGB : 红 绿 蓝 三原色值, 每个值分16个等级, 最小为0, 最大为f;
- #ARGB : 透明度 红 绿 蓝 值, 每个值分16个等级, 最小为0, 最大为f;
- #RRGGBB : 红 绿 蓝 三原色值, 每个值分 256个等级, 最小为0, 最大为ff;
- #AARRGGBB : 透明度 红 绿 蓝 值, 每个值分 256个等级, 最小为0, 最大为ff;
数组资源
资源数组文件 : 通常将数组定义在 /res/values/arrays.xml文件中;
- 根标签 : <resources> ;
- 子标签 : <array>, <string-array>, <integer-array>;
资源数组类型 : 数组的资源的跟标签都是 <resources>, 不同类型的数组的子元素不同;
- 普通类型数组 : 使用<array>作为子元素标签;
- 字符串数组 : 使用<string-array>作为子元素标签;
- 整数数组 : 使用<integer-array>作为子元素标签;
XML文件中调用数组资源 : @ [packageName :] array/arrayName ;
Java文件中调用数组资源 : [packageName . ]R.array.arrayName ;
- 获取实际普通数组 : TypedArray obtainTypedArray(int id), 根据普通数组资源名称获取实际普通数组, TypedArray类提供了getXxx(int index)方法获取指定索引的元素;
- 获取字符串数组 : Resources String[] getStringArray(int id), 根据字符串数组资源名称获取字符串数组;
- 获取整数数组 : Resources int[] getIntArray(int id), 根据整数数组资源名称获取实际的整数数组;
String
注意点
//不使用转义符则需要用双引号包住整个string
<string name="good_example">"This'll work"</string>
//使用转义符
<string name="good_example_2">This\'ll also work</string>
//错误
<string name="bad_example">This won't work!</string>
格式String
- 常规类型、字符类型和数值类型的占位符格式:
%[index$][标识][最小宽度][.精度]转换符
- 日期和时间类型的占位符格式:
%[index$][标识][最小宽度]转换符
- 与参数不对应的占位符格式:
%[标识][最小宽度]转换符
% ,占位符的起始字符,若要在占位符内部使用%,则需要写成 %% 。
[index$] ,位置索引从1开始计算,用于指定对索引相应的实参进行格式化并替换掉该占位符。
[标识] ,用于增强格式化能力,可同时使用多个 [标识] ,但某些标识是不能同时使用的。
[最小宽度] ,用于设置格式化后的字符串最小长度,若使用 [最小宽度] 而无设置 [标识] ,那么当字符串长度小于最小宽度时,则以左边补空格的方式凑够最小宽度。
[.精度] ,对于浮点数类型格式化使用,设置保留小数点后多少位。
转换符 ,用于指定格式化的样式,和限制对应入参的数据类型。
标示 | 含义 |
---|---|
- | 在最小宽度内左对齐,不可与0标识一起使用 |
0 | 若内容长度不足最小宽度,则在左边用0来填充 |
# | 对8进制和16进制,8进制前添加一个0,16进制前添加0x |
+ | 结果总包含一个+或-号 |
空格 | 正数前加空格,负数前加-号 |
, | 只用于十进制,每3位数字间用,分隔 |
( | 若结果为负数,则用括号括住,且不显示符号 |
转换符 | 描述 |
---|---|
b | 布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false |
n | 平台独立的换行符, 也可通过System.getProperty("line.separator")获取 |
f | 浮点数型(十进制)。显示9位有效数字,且会进行四舍五入。如99.99 |
a | 浮点数型(十六进制) |
e | 指数类型。如9.38e+5 |
g | 浮点数型(比%f,%a长度短些,显示6位有效数字,且会进行四舍五入) |
s | 字符串类型 |
c | 字符类型 |
实例:
<string name="crime_report" >%1$s!
The crime was discovered on %2$s. %3$s, and %4s
< /string>
注意:不能在xml资源中引用该类string资源,只能通过代码来引用。例如,通过Fragment.getString(int resId, Object... formatArgs)
方法来引用该资源。参数Object... formatArgs
就是用来代替占位符。
getString(R.string.crime_report, title, dataString, solvedString, suspect);