在很多时候,我们需要访问android中的资源文件,这些资源文件主要分为两类,一种出于asset目录下,称为原生文件,这类文件在被打包成apk文件时是不会进行压缩的;另一类则是res下的文件,这类文件在打包成apk文件时,会进行小内存优化的哦。
两种不同类型的文件,对应着不同的访问模式。我们先来看看asset文件的访问:
android中有一个专门的类来处理应用对asset文件的访问,这个类就是AssetManager。其内有一个open()方法可以根据用户提供的文件名,返回一个InputStream对象供用户使用。
我们截图看下api中的方法:
这里我们可以看到open方法以及其他的相应方法,对于其中有一个参数accessMode,则指定了系统获取资源的模式。主要值有以下几种:
ACCESS_BUFFER :加载文件到内存中,这种方式适合小文件的读取;
ACCESS_RANDOM:可以随意的向前或者向后的读取数据块
ACCESS_STRAMING:顺序的读取内容
ACCESS_UNKNOWN:当没有明确指定时,使用默认模式
这里我们一定要注意,open(String fileName)默认的使用ACCESS_STREAMING模式进行读取!!
那么我们如何获得一个AssetManager对象呢,在activity中我们可以通过以下的代码获取:
AssetManager assetManager = this.getResources().getAsset();
-----------------------------------------------------------------------------------
如何访问res目录下的文件呢?
我们再activity中可以通过如下方法进行访问,InputStream inputStream = Resources.openRawResource(int id);
api中是这样描述的:
最后,我们一定要注意,asset和res下的文件都是只能读不能写的哦。
android里的资源可以是一个文件(mp3,视频、音频)或者是一个值(一个对话框中的一个标题),这些值被绑定到一个可执行的应用程序。
这些文件和值被绑定到应用程序,你可以修改它们,但是不需要重新编译和重新部署应用程序。android是一个平台,一个框架,这个框架包含许多资源,string、color、bitmap、style等。android的AAPT会自动为这些文件建立一个ID,在程序中就可以以使用这些ID来引用这些resources,如果你想改某个值,只需要修改这些resource而不需要修改源代码。
resources的使用
resoureces就是res目录下的那些目录和文件,常用的有:
res/drawable/ 用来存放图片文件
res/layout/ 用来存放布局定义文件
res/values/ 用来存放一些变量、参数等文件
android允许你定义多个string xml文件 这些resource位于/res/value目录下,文件名是任意的
这是一个普通的字符串资源文件
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <stringname="hello">HelloWorld,SendMessage!</string>
- <stringname="app_name">SMS</string>
- </resources>
当这个文件被创建或修改了,eclipse的adt插件会自动更新你源代码中一个叫R.java的文件
R.java
在R.java的注释部分, 有这样一段话:“AUTO-GENERATE FILE. DO NOT MODIFY”,这个文件是自动生成的,不要修改。
这个文件是在程序编译过程中由aapt(Android Asset Packaging Tool) 自动生成
这个文件中的属性都是public static final的,所以可以直接在Java代码中引用,每个属性都代表一个资源,看起来就像为每个资源都定义了一个ID,然后通过这个ID来访问资源
所有的资源文件都被编译进最后生成的二进制包中,这样能够带来很高的性能和效率
string的定义非常简单
- <stringname="key">value</string>
value可以只普通的字符串也可以是html代码,或者是包含单引号,双引号的字符串
- <stringname="quoted_string">"quoted'string"</string>
- <stringname="double_quoted_string">\"doublequotes\"</string>
- <stringname="target_string">hello<b><i>android</i></b>,youareveryyounger!</string>
在其他的android xml文件中引用含有html标记的值和引用普通的string一样
- <TextViewandroid:text="@string/target_string"
- android:id="@+id/text3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"></TextView>
在java程序中应用这些值可以这样
- this.getResources().getString(R.string.target_string);
dimension resources
android中定义的dimension单位有以下这些
px: pixel(像素)
in:inches(英寸)
mm:millimeter(毫米)
pt:point(点)
dp:density密度
sp:刻度
定义dimension可定义string一样
- <resources>
- <dimenname="mysize_in_pixels">1px</dimen>
- <dimenname="mysize_in_dp">1dp</dimen>
- <dimenname="medium_size">100sp</dimen>
- </resources>
你可以在style中或者定位android UI 中使用这些dimension资源
如果在java中需要使用这些dimensions可以调用getResources方法
- this.getResources().getDimension(R.dimen.mysize_in_pixels);
在ml文件中使用dimension
- <TextViewandroid:text="@string/target_string"
- android:id="@+id/text3"
- android:layout_width="wrap_content"
- android:textSize="@dimen/medium_size"android:layout_height="wrap_content"></TextView>
Image resource
android会为每个放置在res/drawable目录下的图片文件生成ID,ID就是这个图片的文件名,如果一个图片的名是sample.gif那么就会在R.java文件中的drawable下生成
- publicstaticfinalintsample=0x7f020001;
android支持的图片格式有:gif,jpg,png
在xml文件中使用image resource
- <Buttonandroid:text="Button01"
- android:id="@+id/Button01"
- android:layout_width="wrap_content"
- android:background="@drawable/sample"
- android:layout_height="wrap_content"></Button>
在java文件中通过调用getResources的getDrawable方法
- Drawablebitmap=this.getResources().getDrawable(R.drawable.sampe);
- Buttonbutton=(Button)findViewById(R.id.Button01);
- //给button设置一个背景图
- button.setBackgroundDrawable(bitmap);
在android中image是drawable资源的一种类型,android还支持其他的drawable
它叫color-drawable,它本质上是一个彩色矩形
它的定义如下
- <resources>
- <drawablename="red_rectangle">#f00</drawable>
- <drawablename="blue_rectangle">#0000ff</drawable>
- <drawablename="green_rectangle">#f0f0</drawable>
- </resources>
Java中使用color-drawable
- //取得drawable
- ColorDrawbleredDrawable=
- (ColorDrawable)getResources().getDrawable(R.drawable.red_rectnagle);
- //设置textView的背景
- textView.setBackground(redDrawable);
xml中使用color-drawable
- <TextViewandroid:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textAlign="center"
- android:background="@drawable/red_rectangle"/>
1. 相关文件夹介绍
目录Directory | 资源类型Resource Types |
res/anim/ | XML文件,它们被编译进逐帧动画(frame by frame animation)或补间动画(tweened animation)对象 |
res/drawable/ | .png、.9.png、.jpg文件,它们被编译进以下的Drawable资源子类型中: 要获得这种类型的一个资源,可以使用Resource.getDrawable(id) 为了获取资源类型,使用mContext.getResources().getDrawable(R.drawable.imageId) 注意:放在这里的图像资源可能会被aapt工具自动地进行无损压缩优化。比如,一个真彩色但并不需要256色的PNG可能会被转换为一个带调色板的8位PNG。这使得同等质量的图片占用更少的资源。所以我们得意识到这些放在该目录下的二进制图像在生成时可能会发生变化。如果你想读取一个图像位流并转换成一个位图(bitmap),请把图像文件放在res/raw/目录下,这样可以避免被自动优化。 |
res/layout/ | 被编译为屏幕布局(或屏幕的一部分)的XML文件。参见布局声明(Declaring Layout) |
res/values/ | 可以被编译成很多种类型的资源的XML文件。 注意:不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。XML元素类型控制这些资源应该放在R类的什么地方。 尽管这个文件夹里的文件可以任意命名,不过下面使一些比较典型的文件(文件命名的惯例是将元素类型包含在该名称之中): array.xml定义数组 colors.xml定义color drawable和颜色的字符串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分别获得这些资源。 dimens.xml定义尺寸值(dimension value)。使用Resources.getDimension()获得这些资源。 strings.xml定义字符串(string)值。使用Resources.getString()或者Resources.getText()获取这些资源。getText()会保留在UI字符串上应用的丰富的文本样式。 styles.xml定义样式(style)对象。 |
res/xml/ | 任意的XML文件,在运行时可以通过调用Resources.getXML()读取。 |
res/raw/ | 直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID,即R.raw.somefilename。 |
2.自动生成的R class
3.在代码中使用资源
- //Loadabackgroundforthecurrentscreenfromadrawableresource.
- this.getWindow().setBackgroundDrawableResource(R.drawable.my_background_image);
- //WRONGSendingastringresourcereferenceintoa
- //methodthatexpectsastring.
- this.getWindow().setTitle(R.string.main_title);
- //RIGHTNeedtogetthetitlefromtheResourceswrapper.
- this.getWindow().setTitle(Resources.getText(R.string.main_title));
- //Loadacustomlayoutforthecurrentscreen.
- setContentView(R.layout.main_screen);
- //SetaslideinanimationforaViewFlipperobject.
- mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
- R.anim.hyperspace_in));
- //SetthetextonaTextViewobject.
- TextViewmsgTextView=(TextView)findViewByID(R.id.msg);
- msgTextView.setText(R.string.hello_message);
- //在屏幕上显示标准应用程序的图标
- publicclassMyActivityextendsActivity{
- publicvoidonStart(){
- requestScreenFeatures(FEATURE_BADGE_IMAGE);
- super.onStart();
- setBadgeResource(android.R.drawable.sym_def_app_icon);
- }
- }
- //应用系统定义的标准"绿色背景"视觉处理
- publicclassMyActivityextendsActivity
- publicvoidonStart(){
- super.onStart();
- setTheme(android.R.style.Theme_Black);
- }
- }
4. xml文件内引用资源
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <stringname="hello">HelloWorld,HelloDemo!</string>
- </resources>
5. 替换资源(为了可替换的资源和配置)
6. Color Value
- <colorname="color_name">#color_value</color>
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <colorname="opaque_red">#f00</color>
- <colorname="translucent_red">#80ff0000</color>
- </resources>
7.Color Drawables
- <drawablename="color_name">color_value</drawable>
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <drawablename="opaque_red">#f00</drawable>
- <drawablename="translucent_red">#80ff0000</drawable>
- </resources>
8. 图片
9. dimension
- <dimenname="dimen_name">dimen_value单位</dimen>
Java:float dimen = Resources.getDimen(R.dimen.some_name)
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <dimenname="one_pixel">1px</dimen>
- <dimenname="double_density">2dp</dimen>
- <dimenname="sixteen_sp">16sp</dimen>
- </resources>
10. string
- //不使用转义符则需要用双引号包住整个string
- <stringname="good_example">"This'llwork"</string>
- //使用转义符
- <stringname="good_example_2">This/'llalsowork</string>
- //错误
- <stringname="bad_example">Thiswon'twork!</string>
- //错误不可使用html转义字符
- <stringname="bad_example_2">XMLencodingswon'tworkeither!</string>
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <stringname="simple_welcome_message">Welcome!</string>
- <stringname="styled_welcome_message">Weare<b><i>so</i></b>gladtoseeyou.</string>
- </resources>
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textAlign="center"
- android:text="@string/simple_welcome_message"/>
- //AssignastyledstringresourcetoaTextViewonthecurrentscreen.
- CharSequencestr=getString(R.string.styled_welcome_message);
- TextViewtv=(TextView)findViewByID(R.id.text);
- tv.setText(str);
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <stringname="search_results_resultsTextFormat">%1$dresultsfor<b>&quot;%2$s&quot;</b></string>
- </resources>
- //title是我们想赋值给%2$s的字符串
- StringescapedTitle=TextUtil.htmlEncode(title);
- StringresultsTextFormat=getContext().getResources().getString(R.string.search_results_resultsTextFormat);
- StringresultsText=String.format(resultsTextFormat,count,escapedTitle);
- CharSequencestyledResults=Html.fromHtml(resultsText);