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

你可能感兴趣的:(android)