`

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讲义源码

     1.5 Android应用结构分析 24  1.5.1 创建一个Android应用 24  1.5.2 自动生成的R.java 26  1.5.3 res目录说明 27  1.5.4 Android应用的清单文件:  AndroidManifest.xml 28  1.5.5 应用程序权限说明 29  ...

    精通ANDROID 3(中文版)1/2

    第3章 使用Android资源  3.1 资源  3.1.1 字符串资源  3.1.2 布局资源  3.1.3 资源引用语法  3.1.4 定义资源ID供以后使用  3.1.5 已编译和未编译的Android资源  3.2 Android关键资源  3.3 使用任意...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    疯狂Android讲义目录结构: 第2章、Android应用程序界面设计,即View 2.2、布局管理(Layout):LinearLayout、TableLayout、FrameLayout、RelativeLayout; 2.3、基本界面组件:TextView、EditText; Button、...

    Android高级编程--源代码

    2.1.3 Android应用程序的类型 27 2.2 面向移动设备的开发 28 2.2.1 关于硬件设计的考虑事项 28 2.2.2 考虑用户环境 31 2.2.3 Android开发 32 2.3 To-Do List示例 35 2.4 Android开发工具 40 2.4.1 Android...

    Android插件框架Android-Plugin-Framework.zip

    相同的类型TT值相同,但是同一个TT值不代表同一种资源,例如这次编译的时候可能使用03作为layout的TT,那下次编译的时候可能会使用06作为TT的值,具体使用那个值,实际上和当前APP使用的资源类型的个数是相关联的。...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    Android实例代码

    6.1、资源的类型及存储方式: 6.2、使用字符串、颜色、尺寸资源: 6.3、数组资源: 6.4、使用Drawable资源:图片资源; StateListDrawable资源; LayerDrawable资源; ShapeDrawable资源; ClipDrawable资源; ...

    android开发秘籍

    1.7.4 使用android 调试桥 13 1.7.5 签名和发布应用 14 1.8 android market 14 1.8.1 最终用户许可协议 14 1.8.2 提升应用程序的曝光率 15 1.8.3 脱颖而出 15 1.8.4 为应用程序收费 15 1.8.5 管理评论和更新 ...

    精通Android 3 (中文版)2/2

    第3章 使用Android资源  3.1 资源  3.1.1 字符串资源  3.1.2 布局资源  3.1.3 资源引用语法  3.1.4 定义资源ID供以后使用  3.1.5 已编译和未编译的Android资源  3.2 Android关键资源  3.3 使用任意...

    疯狂Android讲义.part2

    1.5 Android应用结构分析 24 1.5.1 创建一个Android应用 24 1.5.2 自动生成的R.java 26 1.5.3 res目录说明 27 1.5.4 Android应用的清单文件: AndroidManifest.xml 28 1.5.5 应用程序权限说明 29 1.6 Android应用的...

    疯狂Android讲义.part1

    1.5 Android应用结构分析 24 1.5.1 创建一个Android应用 24 1.5.2 自动生成的R.java 26 1.5.3 res目录说明 27 1.5.4 Android应用的清单文件: AndroidManifest.xml 28 1.5.5 应用程序权限说明 29 1.6 Android应用的...

    Android 4游戏编程入门经典

     1.4 android的功能和体系结构  1.4.1 内核  1.4.2 运行库和dalvik虚拟机  1.4.3 系统库  1.4.4 应用程序框架  1.5 软件开发工具包  1.6 开发人员社区  1.7 设备,设备,设备  1.7.1 硬件  1.7.2 设备的...

    Google Android SDK开发范例大全(完整版)

    本文假设您使用的是 Eclipse IDE 和用于 Eclipse 的 Android Developer Tools 插件。Android 应用程序是用 Java 语言编写的,但是是在 Dalvik VM(非 Java 虚拟机)中编译和执行的。在 Eclipse 中用 Java 语言编程...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...

    android游戏编程入门

     1.4 Android的功能和体系结构 5  1.4.1 内核 6  1.4.2 运行库和Dalvik虚拟机 6  1.4.3 系统库 7  1.4.4 应用程序框架 8  1.5 软件开发工具包 8  1.6 开发人员社区 9  1.7 设备,设备,设备 9  1.7.1 硬件 ...

    java8源码-hummer-android:悍马-android

    安装过程中可能会遇到选在安装类型,有Standard和Custom两种。 Standard,表示一切使用默认配置。 Custom,顾名思义可以根据用户需求自定义。 这里我们使用 Standard 即可。 2. 工程结构 运行Android Studio,打开 ...

Global site tag (gtag.js) - Google Analytics