Android资源类型、结构、使用

Android中通过@[package:]type/name的形式来引用资源
[package:]可以省略,省略后引用本地资源
type代表一种资源类型命名空间,例如:
-R.id
-R.drawable
-R.layout
-R.string
-R.attr
-R.raw
-R.arry
-R.plural等等
name代表资源的唯一标识,例如:
-text1
完整的资源引用:R.id.text1,在java中为解释为唯一的int


Android中的资源又分为编译的和不编译的,其中raw下的资源不会编译,用于存放一些音频、视频等资源。

资源的存放位置
颜色-------------/res/values/*----------------------------------节点为/resources/color,通过R.color.*引用
字符串----------/res/values/*-----------------------------------节点为/resources/string,通过R.string.*引用
字符串数组----/res/values/*------------------------------------节点为/resources/string-array,通过R.array.*引用
复数------------/res/values/*------------------------------------节点为/resources/plurals,通过R.plurals.*引用
尺寸------------/res/values/*-------------------------------------节点为/resources/dimen,通过R.dimen.*引用
图像------------/res/drawable/*----------------------------------直接存放资源文件,文件名必须是合法的java变量名,通过R.drawable.*引用
图形-----------/res/values/*或/res/drawable/*----------------节点为/resources/drawable或在/res/drawable新建xml文件使用shap节点,均通过R.drawable.*引用
任意xml文件-/res/xml/*-----------------------------------------直接存放xml文件,这些文件使用AAPT编译器编译,通过R.xml.*引用
任意资源文件-/res/raw/*----------------------------------------直接存放资源文件(一般是音频和视频文件),通过R.raw.*引用
任意资源文件(不产生资源id)-/assets/*-----------------------直接存放资源文件,不会进行编译,不会产生资源id,须通过路径访问
注:除了/res/values/下的文件是使用文件内容生成资源id,其他目录(除assets目录)都是使用文件名作为资源id(故须符合java命名规则)


下面是一些例子:
普通字符串

<resources>
<string name="hello">Hello World, AndroidLabActivity!</string>
<string name="app_name">AndroidLab</string>
</resources>


/*获取字符串资源*/
String str = getString(R.string.hello);


字符串数组

<resources>
<string-array name="stringarray">
<item>字符串数组子项目1</item>
<item>字符串数组子项目2</item>
<item>字符串数组子项目3</item>
</string-array>
</resources>


/*获取字符串数组*/
Resources res = getResources();
String[] strArray = res.getStringArray(R.array.stringarray);


复数字符串

<resources>
<plurals name="pluralstest">
<item quantity="one">there is 1 egg</item>
<item quantity="other">there are %d egg</item>
</plurals>
</resources>


/*获取附属字符串资源*/
Resources res = getResources();
String str = res.getQuantityString(R.plurals.pluralstest, 3,3);//第一个参数3表示quantity,第二个参数3用于显示%d


颜色

<resources>
<color name="color1">#00ff00</color>
<color name="color2">#ffff00</color>
<color name="color3">#00ffff</color>
</resources>


/*获取颜色资源*/
int color1 = res.getColor(R.color.color1);//返回的是代表某一颜色的int值


尺寸

<resources>
<dimen name="mypix">5px</dimen>
<dimen name="mydip">5dip</dimen>
<dimen name="mysp">5sp</dimen>
</resources>


/*获取尺寸资源*/
float dimen = res.getDimension(R.dimen.mydip);
int dimenByPixOffset = res.getDimensionPixelOffset(R.dimen.mysp);//转为px,并去掉小数部分
int dimenByPixRound = res.getDimensionPixelSize(R.dimen.mydip);//转为px,并四舍五入小数部分


图像

把用到的图像资源,例如把testimg.png放到/res/drawable目录下后即可通过文件名引用资源
/*获取图像资源并应用到按钮上*/
BitmapDrawable bd = res.getDrawable(R.drawable.testimg);
button.setBackgroundDrawable(bd);

button.setBackgroundResource(R.drawable.testimg);


图形

<resources>
<drawable name="red_rec">#ff0000</drawable>
<drawable name="blue_rec">#0000ff</drawable>
<drawable name="green_rec">#00ff00</drawable>
</resources>


/*获取图形资源*/
ColorDrawable cd = (ColorDrawable) res.getDrawable(R.drawable.red_rec);
button.setBackgroundDrawable(cd);

button.setBackgroundResource(R.drawable.red_rec);


另外还可以通过<shap>来实现更加丰富的图形
在/res/drawable目录下新建一xml文件,以<shap>为根节点,一个xml文件代表一种图形。
新建一个渐变颜色的矩形图形drawlable_gradient.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#FFF9F9"
android:endColor="#FFD5D5D5"
android:angle="270.0"/>
</shape>

在main.xml文件中设置画面背景
android:background="@drawable/drawlable_gradient"
新建一个圆角矩形图形rounded_rec.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#f0600000"/>
<stroke android:width="3dp" color="#ffff8080"/>
<corners android:radius="13dp"/>
</shape>


/*使用圆角矩形*/
GradientDrawable gd = (GradientDrawable ) res.getDrawable(R.drawable.rounded_rec);
button.setBackgroundDrawable(gd);

button.setBackgroundResource(R.drawable.rounded_rec);

注意:图像目录下的资源会被解释为BitmapDrawable对象,简单的drawable图形(如上述的ColorDrawable,定义在resources下的drawable节点)会被解释为ColorDrawable对象,而复杂的drawable图形(如上述的GradientDrawable,定义为单独xml文件)会被解释为GradientDrawable对象.

xml
首先新建一个xml文件(/res/xml/test.xml)内容如下

<person>
<name>Jack</name>
<age>20</age>
<weight>68kg</weight>
</person>


/*获取xml资源,并解释*/
XmlResourceParser xrp = res.getXml(R.xml.test);
StringBuilder sb = new StringBuilder();
try {
int eventType = xrp.next();
while(XmlResourceParser.END_DOCUMENT != eventType){
if(eventType == XmlResourceParser.START_DOCUMENT){
sb.append("=============start doc\n");
else if(eventType == XmlResourceParser.START_TAG){
sb.append("========start tag:"+xrp.getName()+"\n");
}else if(eventType == XmlResourceParser.END_TAG){
sb.append("========end tag:"+xrp.getName()+"\n");
}else if(eventType == XmlResourceParser.TEXT){
sb.append("=====text:"+xrp.getText()+"\n");
}
eventType = xrp.next();
}
sb.append("=============end doc\n");
Log.e("xml Demo", sb.toString());
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


raw资源
raw下的资源文件不会被编译,但有资源id,在引用是直接通过R.raw.*引用即可.
下面是一个读取文本文件的例子,摘自《精通Android 3》page62

Resources res = getResources();
InputStream is = res.openRawResources(R.raw.test);
String myText = convertStreamToString(is);
is.close();
return myText;

String convertStreamToString(InputStream is) throws IOExpection{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i = is.read();
while(i != -1){
baos.write(i);
i = is.read();
}
return baos.toString();
}


assets资源
assets资源不会产生资源id,只能通过路径来访问
Android提供了AssetManager类来访问这些资源,下面例子摘自《精通Android 3》page63

String getStringFromAssetFile(Activity activity){
AssetManager am = activity.getResources();
InputStream is = am.open("text.txt");
String s = convertStreamToString(is);
is.close();
return s;
}



资源的总体目录结构:
/assets/*/*.*
/res/values/strings.xml
/colors.xml
/dimens.xml
/attr.xml
/styles.xml
/drawable/*.*
/anim/*.xml
/layout/*.xml
/raw/*.*
/xml/*.xml
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值