Android(安卓)Resource
概述
Android开发中除了Code之外,资源文件则是开发中经常使用的,本文将系统的介绍Android开发中关于Resource的各种。Android中的资源是在代码中使用的外部文件。这些文件作为应用程序的一部分,被编译到应用程序当中。Android中支持大量的资源文件,如XML文件、图片文件、音频和视频文件。
Resource 分类
目录 | 资源类型 |
---|---|
anim/ | 定义动画属性的XML文件。它们被保存在res/anim/文件夹下,通过R.anim类访问 |
color/ | 定义颜色状态列表的XML文件。它们被保存在res/color/文件夹下,通过R.color类访问 |
drawable/ | 图片文件,如.png,.jpg,.gif或者XML文件,被编译为位图、状态列表、形状、动画图片。它们被保存在res/drawable/文件夹下,通过R.drawable类访问 |
layout/ | 定义用户界面布局的XML文件。它们被保存在res/layout/文件夹下,通过R.layout类访问 |
menu/ | 定义应用程序菜单的XML文件,如选项菜单,上下文菜单,子菜单等。它们被保存在res/menu/文件夹下,通过R.menu类访问 |
raw/ | 任意的文件以它们的原始形式保存。需要根据名为R.raw.filename的资源ID,通过调用Resource.openRawResource()来打开raw文件 |
values/ | 包含简单值(如字符串,整数,颜色等)的XML文件。这里有一些文件夹下的资源命名规范。arrays.xml代表数组资源,通过R.array类访问;integers.xml代表整数资源,通过R.integer类访问;bools.xml代表布尔值资源,通过R.bool类访问;colors.xml代表颜色资源,通过R.color类访问;dimens.xml代表维度值,通过R.dimen类访问;strings.xml代表字符串资源,通过R.string类访问;styles.xml代表样式资源,通过R.style类访问 |
xml/ | 可以通过调用Resources.getXML()来在运行时读取任意的XML文件。可以在这里保存运行时使用的各种配置文件 |
R类
编译Android应用时,自动生成R类;该类包含系统中使用的所有资源文件的标识;
资源类:数组array、属性attr、颜色color、图片drawable、ID标识id、布局layout、字符串string;
引用方法
1.资源文件中的引用规则:@[包名称:]资源类型 / 资源名称(在同一个包中引用资源,包名是可选的)
Ex:
2.Java代码中引用的规则:1.获取Resource对象;2.调用Resource实例方法并传递参数(R.resourceTypeName.attributeName)
Ex:
<?xml version="1.0" encoding="utf-8"?> Test Resources 从代码中引用! 从资源文件引用!
String str = getString(R.string.test_str2).toString();
Ex:
<?xml version="1.0" encoding="utf-8"?> 150px 100px 30mm 10mm
// 获得Resources 实例 Resources r = getResources(); // 通过getDimension方法获得尺寸值 float btn_h = r.getDimension(R.dimen.btn_height); float btn_w = r.getDimension(R.dimen.btn_width);
解析属性
资源解析主要涉及到两个类,一个是AttributeSet,另一个是TypedArray
AttributeSet
该类位于android.util.AttributeSet,纯粹是一个辅助类,当从XML文件解析时会返回AttributeSet对象,该对象包含了解析元素的所有属性及属性值。并且在解析的属性名称与attrs.xml中定义的属性名称之间建立联系。AttributeSet还提供了一组API接口从而可以方便的根据attrs.xml中已有的名称获取相应的值。
Attribute对象一般作为View的构造函数的参数传递过来:
publlic TextView(Context context,AttributeSet attrs,int defStyle)
AttributeSet中的API可按功能分为以下几类,假定TextView定义如下所示:
操作特定属性:
public String getIdAttribute()
,获取id属性对应的字符串,此处返回"@+id/tv"public String getStyleAttribute()
,获取style属性对应的字符串,返回"@style/text"public int getIdAttributeResourceValue(int defaultValue)
,返回id属性对应的int值,此处对应R.id.tv。
操作通用属性:
public int getAttributeCount()
,获取属性的数目,本例中返回4public String getAttributeName(int index)
,根据属性所在位置返回相应的属性名称。例如,id=0,layout_width=1,layout_height=2,style=3,如果getAttributeName(2),则返回android:layout_heightpublic String getAttributeValue(int index)
,根据位置返回值。本例中,getAttributeValue(2)则返回"wrap_content"。public String getAttributeValue(String namespace,String name)
,返回指定命名空间,指定名称的属性值,该方法说明AttributeSet允许给一个XML Element的属性增加多个命名空间的属性值。public int getAttributeResource(int index)
,返回指定位置的属性id值。本例中,getAttributeResource(2)返回R.attr.layout_width。前面也说过,系统会为每一个attr分配一个唯一的id。
获取特定类型的值:
public XXXType getAttributeXXXType(int index,XXXType defaultValue)
,其中XXXType包括int、unsigned int、boolean、float类型。使用该方法时,必须明确知道某个位置(index)对应的数据类型,否则会返回错误。而且该方法仅适用于特定的类型,如果某个属性值为一个style类型,或者为一个layout类型,那么返回值都将无效。
TypedArray
程序员在开发应用程序时,在XML文件中引用某个变量通常是android:background="@drawable/background",该引用对应的元素一般为某个View/ViewGroup,而View/ViewGroup的构造函数中会通过obatinStyledAttributes方法返回一个TypedArray对象,然后再调用对象中的getDrawable()方法获取背景图片。TypedArray是对AttributeSet数据类的某种抽象。对于andorid:layout_width="@dimen/width",如果使用AttributeSet的方法,仅仅能获取"@dimen/width"字符串。而实际上该字符串对应了一个dimen类型的数据。TypedArray可以将某个AttributeSet作为参数构造TypedArray对象,并提供更方便的方法直接获取该dimen的值。
TypedArray a = context.obtainStyledAttributes(attrs,com.android.internal.R.styleable.XXX,defStyle,0);
方法obtainStyledAttributes()的第一个参数是一个AttributeSet对象,它包含了一个XML元素中定义的所有属性。第二个参数是前面定义的styleable,appt会把一个styleable编译成一个int[]数组,该数组的内部实现正是通过遍历AttributeSet中的每一个属性,找到用户感兴趣的属性,然后把值和属性经过重定位,返回一个TypedArray对象。想要获取某个属性的值则调用相关的方法即可,比如TypedArray.getDrawbale(),TypedArray.getString()等。getDrawable(),getString()方法内部均通过Resources获取属性值。
资源加载机制
参考:https://mp.csdn.net/postedit
http://finally-m.iteye.com/blog/2219407
更多相关文章
- A015-布局之LinearLayout
- Android(安卓)Studio初步使用教程
- Android数据存储方式:SharePreference、SQLite、ContentProvider
- Android(安卓)NDK探究奥秘一:Android(安卓)Studio创建第一个JNI项
- Android中Adapter用法总结
- shape基本用法及全部属性定义
- Android中px与dip,sp与dip等的转换工具类
- 分享自学Java,Web,Android视频教程资源(自学Android,有这些就够了)
- NPM 和webpack 的基础使用