当前位置: 首页 > news >正文

Android之Providing Resources(提供资源)

当你写程序的时候应该习惯于把一些程序需要用到的资源,例如图片和字符串,分开并独立地保存在你的程序代码之外,这样你就可以独立地维护这些资源文件。你还应该通过特殊的名字的文件路径,为特定的设备配置提供可替换的资源文件。在运行时,Android会基于现在的配置自动应用合适的资源文件。例如,你可以根据不同的屏幕尺寸或基于语言设置的不同的字符串提供不同的UI布局。

 

 

 

一旦你将资源文件与程序代码分开保存,你可以通过资源ID号来使用对应的资源文件,这些资源ID在项目的R类中自动生成。关于如何在你的程序里面使用资源,可以看看Accessing Resources。这篇文档将介绍如何在你的Android工程下来组织管理你的资源文件,以及如何给特定的设备配置提供可替代的资源。

 

 

 

Grouping Resource Types/资源文件的分类

 

在你的工程的res/目录下,每个子目录对应一种类型的资源文件。例如,下面是一个简单工程的文件树状结构。

MyProject/

    src/ 

        MyActivity.java 

    res/

        drawable/ 

            icon.png 

        layout/ 

            main.xml

            info.xml

        values/ 

            strings.xml 

这个例子中你可以看到,res/目录下包含了所有的资源文件(在子目录下):一个图片资源,两个布局资源文件,和一个string资源文件。这个资源目录的名字是非常重要的,如Table1

 

1. 工程res/下面可以支持的资源目录:

目录

资源类型

animator/

定义动画属性(property animations)的XML文件.

anim/

定义补间动画(tween animations)的XML文件. (动画的属性也可以保存在这个目录下,但是animator/目录是用来保存动画属性的并区别开两个目录)

color/

定义了一些colors对应值的XML文件,见Color State List Resource

drawable/

Bitmap文件(.png,.9.png,.jpg,.gif)或者能被编译为drawable类型的XML文件

·         Bitmap files

·         Nine-Patches(re-sizable bitmaps)State lists

·         Color drawables

·         Shapes

·         Animation drawables

Drawable Resources

layout/

定义用户界面布局的XML文件. Layout Resource.

menu/

定义程序menusXML文件,比如Options Menu,Context Menu,或者Sub Menu.Menu Resource

raw/

放置任意的文件,必须为原始形式。使用raw InputStream来打开这些资源文件,调用Resources.openRawResource()方法来打开resource ID对应的资源,比如R.raw.filename

然而,如果你需要访问原始文件名字和文件目录结构,你可以考虑将一些资源文件保存在 assets/ 目录下(而不是res/raw/)。放在assets/下的文件不提供一个资源ID,所以你只能使用 AssetManager来读取它们。

values/

包含一些简单值的XML文件,比如stringsintegers,和颜色

在其他res/子目录下定义的XML资源文件定义的是一个单独的基于XML文件名的资源,在values/目录下的文件描述了多种资源。例如这个目录下的某个资源文件,每个<resources>的子节点定义了一个单独资源。比如,<string>节点创建了一个R.string资源,<color>节点创建了一个R.color资源。

因为每个资源都是使用自己的XML文件定义的,你可以任意命名文件,并在一个文件里面放不同种类的资源。但是,为了清晰可见(for clarity),你也许想要在一个文件里面放置统一的资源类型。例如,下面是这个目录下创建资源文件的俗称约定:

·         arrays.xml:放置资源数组(typed arrays

·         colors.xml:放置颜色值(color values

·         dimens.xml:放置长度值(dimension values

·         strings.xml:放置字符串值(string values

·         styles.xml:放置样式(styles

String ResourceStyle Resource以及 More Resource Types

xml/

在运行时可以通过调用Resources.getXML()方法来读取该目录下的任意XML文件。各种XML配置文件都必须保存在这里,比如searchable configuration

 

 

注意:你不可以直接将资源文件保存在res/目录下—这样做会引起编译错误。

 

要了解更多关于某种特定资源类型的信息,参见:Resource Types文档

 

你保存在所有子目录中的资源也就是 1 中定义的你的默认资源。也就是说,这些资源为您的应用程序定义了默认的设置和内容。然而,不同类型的Android驱动设备需要不同类型的资源。例如,当一个设备有比正常屏幕大的屏,那么你应该提供不同的布局资源来充分利用屏幕剩余的空间。或者,如果设备有不同的语言设置,那么应该提供不同的字符串资源来吧文本翻译到你的用户界面上。为了给不同的设备配置提供不同的资源,除了您的默认资源你还需要提供可替代资源。

 

 

Providing Alternative Resources/提供可替换的资源

几乎每个程序都应该给特定的设备配置提供可替换的资源。例如,可以为不同的屏幕尺寸提供可替换的资源,不同的语言提供可替换的字符串。运行时,Android会自动检查当前设备配置并为你的应用加载合适的资源。

 

 

 

 

要指定一组资源配置的具体方案(To specify configuration-specific alternatives for a set of resources)

  1. res/下创建一个新的目录<resources_name>-<config_qualifier>
  • <resources_name>是和默认资源相对应的目录名称(如表1定义)
  • <config_qualifier>是指定一个配置相应的名称,同时放在这个目录下的资源会在这个配置上使用。你可以附加多个<config_qualifier>。用破折号进行分开( 2定义)
在你新的目录下保存你的可替换资源,这个资源文件必须和默认的资源命名一样

例如,下面是一些默认资源和可替换资源:

res/

    drawable/  

        icon.png

        background.png   

    drawable-hdpi/ 

        icon.png

        background.png 

 

这个hdpi表明在这个目录下的资源将会在高分辨率(hign-density)的设备上使用。同时每个drawable目录下的图片根据特定屏幕密度绘制大小,文件名是相同的。这样,你使用引用icon.pngbackgrou.png的资源ID是相同的,但是android会根据通过比较可替代资源的目录名称与设备配置信息来选择最合适的drawable下的资源。

 

 

Android支持多种配置标识符(qualifiers),你可以给你一个目录名字增加多个标识符(qualifiers),通过破折号分开。Table 2列出了合法的配置标识符(qualifiers),如果你在一个资源目录下使用了多个标识符,则按顺序来决定优先权,这些配置标识符必须按下表列出来的顺序添加到目录名称:

 

注意:Android中的一些配置标识符是在1.0版本之后加上的,所以并不是任意版本的Android系统都支持表2列出的配置标识符。新的配置标识符都说明了它们是在哪一版本添加的。为了避免任何可能出现的额问题,您应该始终为您的应用程序所使用的资源设置默认值。要了解更多信息,参见Providing the Best Device Compatibility with Resources部分。

 

 

 

【未完待续】

 

欢迎转载,转载请注明出处:http://www.cnblogs.com/CodeGuy/

转载于:https://www.cnblogs.com/CodeGuy/archive/2011/08/25/2153901.html

相关文章:

  • SAP ECC Web Dynpro ICM Config...
  • 算法之美:排序
  • 基于dedup技术的远程相似文件同步
  • 在Silverlight中对多个异步任务的调用
  • OGC标准介绍 4
  • POJ1991 Turning in Homework——贪心+动态规划——Pku1991
  • 在不影响页面内容的情况下来减少站点的页面输出量、增加页面的访问速度。...
  • c#缓存介绍(转)
  • SQL表达式结果集的小数精度
  • 随机取数据算法性能比较
  • 2010年7月微软最有价值专家(MVP)当选名单
  • 【海洋女神原创】安装导论--谨以此文与那些徘徊在安装的大门外,并且被花哨的功能所迷惑的朋友们共勉。...
  • 引用变量优化
  • hibernate的工作原理
  • 快来赢取价值8万元人民币的MSDN订阅
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Angular 2 DI - IoC DI - 1
  • C# 免费离线人脸识别 2.0 Demo
  • canvas绘制圆角头像
  • iOS 系统授权开发
  • JavaScript 基础知识 - 入门篇(一)
  • k8s如何管理Pod
  • React+TypeScript入门
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Swoft 源码剖析 - 代码自动更新机制
  • 浮现式设计
  • 基于axios的vue插件,让http请求更简单
  • 无服务器化是企业 IT 架构的未来吗?
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • !!java web学习笔记(一到五)
  • # 数论-逆元
  • #android不同版本废弃api,新api。
  • $forceUpdate()函数
  • (39)STM32——FLASH闪存
  • (C++20) consteval立即函数
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (接口自动化)Python3操作MySQL数据库
  • (全注解开发)学习Spring-MVC的第三天
  • (已解决)什么是vue导航守卫
  • (转)ABI是什么
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET中两种OCR方式对比
  • .net中应用SQL缓存(实例使用)
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型