android资源访问应用知识点,android resource(应用资源)总结

android的应用资源包括动画,图像,字符串,布局文件等等,所有的资源文件都存放在app/src/res目录下。但是,需要注意的是,不同的文件类型需要放在不同的资源目录下,对应的资源目录的名称也不相同。如存放图片的目录是drawable目录;存放布局文件的目录是layout目录等等。下面具体介绍关于android应用资源的相关知识要点

资源类型及其对应的文件目录名称:(以下目录都是存放在路径:app/src/res/目录下)

animator目录:属性动画的xml文件(Property Animation)

anim目录:补间动画的xml文件(Tween animation)

color目录:颜色状态列表的 XML 文件,即View处在不同状态对应不同的颜色的xml文件

drawable目录:.png图片,.jpg图片,drawable类型的xml文件等等

mipmap目录:不同启动器图标密度的可绘制文件

layout目录:用户定义界面布局的文件

menu目录:菜单资源文件

raw目录:以原始格式保存的任意文件。要使用Raw打开这些资源 InputStream,请Resources.openRawResource()使用资源ID(如R.raw.xxx)调用。如mResources.openRawResource(R.raw.filename)

values目录:包含简单值(例如字符串,整数和颜色)的XML文件。如string.xml,color.xml,dimen.xml,style.xml,attr.xml文件等等

font目录:字体格式文件,如.ttf .otf .ttc等文件。编译后可以通过R.font.abc(java代码中)或者@font/abc(xml文件中)去访问

Q:上面讲到的raw目录可以存放所有类型的任意文件,那么android为何还要提供assert目录(路径:app/src/,和res、java、AndroidManifest.xml同一级目录)?

A:res/raw目录和assert目录的区别主要有以下几点:

1、res目录下的文件都是可以被编译的资源文件,即系统在编译apk的时候,能在R.java文件中生成对应的该资源的id。由于raw文件res目录下,所以也能在R.java生成对应的id。而assert目录是跟res目录平级的,所以不会生成对应的id,即在编译阶段,不会编译assert目录下的文件。

2、res目录下只能存放文件,不能存放目录。实际上,所有res目录下,都是存放对应的资源类型目录(如raw | drawable | string | anim | animation等等)。而assert目录下是可以存放子目录的,然后通过context.getAssert()方法可以拿到assert目录对应的指针对象,之后就可以对整个assert目录进行操作

3、mResources.openRawResource(R.raw.×××)访问raw目录下的文件资源时,拿到的是对应的文件的字节流inputStream。而通过context.gerAssert()方法拿到的是assert整个目录对象,可以通过context.getAssert().list(Path)列出对应的目录下的所有文件

4、res/raw目录和assert目录唯一的相同点是:只能对其目录下的文件进行读操作,没有写权限。两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制,即不会存放在data\data\yourApp目录下。

android系统设计的时候,是将资源(如UI布局,动画资源,音频资源等等)和源代码分离开的。这样的设计,带来了两个好处。具体如下:

1、整个项目的结构更加清晰。源代码专注于实现对应的功能;资源专注于提供素材。这样对后期的维护提供了非常便利的先天条件

2、可以提供适用于不同设备配置的备用资源,如:为720p的屏幕提供一套布局,为1080p的屏幕提供另一套布局。这是安卓APP的最基础的两大特性(提供多个入口点;兼容不同的设备)之一

为设备提供兼容性资源的方法

1、android兼容性资源的匹配是通过目录名称来实现的,所以对应的资源目录的名称是核心关键。具体格式为:在res/以形式创建一个名为 - 的新目录。

:是相应的默认资源的目录名(对应的类型名称在(1)知识点)

:是一个配置修饰符,用于指定要使用这些资源的单个配置,如果需要配置多个,那么用破折号"-"隔开。对应修饰符的链接地址

2、"兼容性资源目录"一定是跟"默认资源目录"在同一目录下,并且是平级的。具体是:都在app/src/res/目录下。如app/src/res/drawable-hdpi目录和app/src/res/drawable目录

3、"兼容性资源目录"的名称不区分大小写,资源编译器在编译资源的时候会将目录名称全部转化为小写,然后再去匹配对应的规则

4、"兼容行资源目录"的名称中"修饰符"的顺序一定要严格按照顺序来,具体的顺序依据官方提供的标准来

(链接地址),如:错误: drawable-hdpi-port/ 正确: drawable-port-hdpi/ 原因:官方定义的"屏幕方向"(port)的优先级比"屏幕密度"(hdpi)的优先级高,所以port修饰符一定要排在hdpi前面

系统兼容性资源的匹配规则:

1、遍历所有与限定符相关的配置

2、根据遍历得到的所有相关配置,将"兼容性资源"中所有与配置矛盾的资源文件全部排除掉

3、根据官方提供的修饰符列表中的"修饰符"优先级,开始匹配特定的修饰符

(1) 如果有资源目录包含该修饰符,则将其他所有不包含该修饰符的资源目录排除掉

(2) 如果没有资源目录包含该修饰符,则继续寻找下个优先级的修饰符

4、重复步骤(2),(3),直到只剩下一个资源目录

具体例子:

资源目录:

drawable/

drawable-en/

drawable-fr-rCA/ -- 3

drawable-en-land/ -- 4

drawable-en-port/ -- 5

drawable-en-notouch-12key/ -- 6

drawable-port-ldpi/ -- 7

drawable-port-notouch-12key/ -- 8

设备配置:

Locale = en-GB -- 1

Screen orientation = port -- 2

Screen pixel density = hdpi -- 3

Touchscreen type = notouch -- 4

Primary text input method = 12key -- 5

开始匹配

步骤1:语音类型是en,所以3会被排除;屏幕方向是port,所以4会被排除,所以第一步骤设备所有配置,就排除了两个资源目录drawable-fr-rCA/和drawable-en-land/

步骤2:匹配语言en,因为5包含了en,所以将所有不包含修饰符en的目录排除,所以1、6、7、8会被排除

步骤3:重复步骤2,匹配区域GB,由于只剩下2和5,并且2和5不包含区域修饰符,所以继续匹配下一个修饰符

步骤4:下一个修饰符是方向port,由于5包含了port修饰符,所以排除不包含port修饰符的2

经过以上步骤,最后只剩下5符合规则,所以该设备的兼容性资源会选择5--drawable-en-port

访问资源的方式

1、在java代码中访问;具体通过编译生成的R.java文件对应的索引去寻找对应的资源。例子:R.string.hello

2、在xml文件中访问;具体格式为@String/hello

创建别名资源(这篇博客写的很好)

1、对于图片,可以创建一个xml文件,然后在xml文件中通过bitmap节点引用到特定的图片。如:

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

2、布局文件,通过创建xml文件,然后在xml文件中通过merge节点引用其他布局文件,如:

3、字符串及其他简单值:只需要将所需字符串的资源ID用作新字符串的值,对于颜色等其他简单值属性,也是一样的

Hello

@string/hello

#f00

@color/red

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值