Android Resources

Resources

概览

Overview

提供资源

Providing Resources

感悟

外部化应用资源,例如图像和代码中的字符串,这样有利于您单独维护这些资源。 此外,您还应该为特定设备配置提供备用资源,方法是将它们分组到专门命名的资源目录中。 在运行时,Android 会根据当前配置使用适当的资源。例如,您可能需要根据屏幕尺寸提供不同的 UI 布局,或者根据语言设置提供不同的字符串。

资源目录结构

在res/下的资源在项目R类中都有相应的资源ID。如需访问原始文件名和文件层次结构,则可以考虑将某些资源保存在 assets/ 目录下(而不是 res/raw/)。assets/ 中的文件没有资源 ID,因此您只能使用 AssetManager 读取这些文件。

备用资源

在创建备用资源目录,追加多个限定符时,一定要用短划线(-)隔开。并且一定要按照Providing Resources中表2描述的上下顺序来添加。如果限定符顺序错误,那么该资源将被忽略。

默认资源

要使应用支持多种设备配置,则务必为应用使用的每种资源类型提供默认资源,这一点非常重要。如果您将所有字符串放入带有语言和区域限定符的目录中,则在语言设置不支持您的字符串的设备上运行应用时,应用将会崩溃。 但是,只要提供默认 values/ 资源,应用就会正常运行(即使用户不理解该语言,这也总比崩溃要好)。

屏幕密度备用资源的适配原则

如果涉及的限定符是屏幕像素密度,则 Android 会选择最接近设备屏幕密度的选项。通常,Android 倾向于缩小大型原始图像,而不是放大小型原始图像。

屏幕尺寸备用资源的适配原则

根据屏幕尺寸限定符选择资源时,如果没有更好的匹配资源,则系统将使用专为小于当前屏幕的屏幕而设计的资源(例如,如有必要,大尺寸屏幕将使用标准尺寸的屏幕资源)。 但是,如果唯一可用的资源大于当前屏幕,则系统不会使用这些资源,并且如果没有其他资源与设备配置匹配,应用将会崩溃(例如,如果所有布局资源均用 xlarge 限定符标记,但设备是标准尺寸的屏幕)。

访问资源

Accessing Resources

感悟

资源类型

资源有两种类型, 一种是文件型, 比如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() 读取字节流。

R类.png

引用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);

参考

【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组

Android Resource介绍和使用

Java中强大的format

Java魔法堂:String.format详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,423评论 0 4
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,733评论 6 342
  • 你说我会怎样呢?只是突然就想起你,想着恋爱的感觉,才十八岁却活出了三十岁的样子…… 你说你还好吗?我在落日...
    南阳l阅读 148评论 0 1
  • 1.现在几乎所有的父母只要有条件就都会为孩子选择好的学校,目的是为了给孩子提供好的环境。可是,再好的学校里,每个孩...
    annie11888阅读 214评论 0 2