个人笔记整理
Android 资源
Android中的资源,一般分为两类:
-
系统内置资源:Android SDK中所提供的已经定义好的资源,用户可以直接拿来使用。
-
用户自定义资源:用户自己定义或引入的,只适用于当前应用的资源。
res目录
res目录:可以使用R类访问的资源,放到该目录下。
res子目录 | 可以存放的资源 |
---|---|
res/anim | 定义补间动画的XML文件 |
res/color | 定义不同状态下颜色列表的XML文件 |
res/drawable | 各种位图文件(png、jpg、gif、9-Patch) 可以编译成各种drawable对象的XML文件 |
res/mipmap | 应用程序Launcher图标 |
res/layout | 用户界面布局文件 |
res/menu | 菜单资源布局文件(选择菜单、子菜单、上下文菜单) |
res/raw | 任意类型的原生资源 |
res/values | 各种简单值的XML文件(包括字符串、整数、数组、尺寸等) |
res/xml | 其它任意的XML文件(可能没有特殊意义的XML文件) |
在Android中使用res目录下资源或系统内置资源:
- 在其它资源文件中使用资源:
- 使用res目录下资源:
@[<pack_name>:]res_type>/<res_name>
- 使用系统内置资源:
@android:<res_type>/<res_name>
- 使用res目录下资源:
- 在Java代码中使用资源:(使用资源的标识符)
- 使用res目录下资源:
[<pack_name>.]R.res_type.res_name
- 使用系统内置资源:
android.R.res_type.res_name
- 使用res目录下资源:
getResources()使用
Resources res = getResources();
String appName = res.getString(R.string.app_name);
Drawable drawable
= res.getDrawable(R.drawable.ic_launcher);
res/values
res/values/String.xml
<resources>
<string name="app_name">HelloWorld</string>
<string name="user_name">张三</string>
</resources>
res/values/colors.xml
<resources>
<color name="colorPrimary">#3F51B5</color>
</resources>
res/values/dimens.xml
<resources>
<dimen name="view_length">100dp</dimen>
</resources>
res/values/array.xml
Array资源可以分为三类:
- string-array:字符串组成的数组形式。
- integer-array:int型数据组成的数组形式。
- array:一般数组形式(数据元素类型不限)。
<resources>
<string-array name="user_name">
<item>张三</item>
<item>李四</item>
</string-array>
<integer-array name="age">
<item>18</item>
<item>20</item>
</integer-array>
<array name="pic">
<item>@drawable/user1</item>
<item>@drawable/user2</item>
</array>
</resources>
java代码中使用
Resources res = getResources();
String[] userName = res.getStringArray(R.array.user_name);
int[] age = res.getIntArray(R.array.age);
TypedArray userPic = res.obtainTypedArray(R.array.pic);
//对于TypedArray类型,需要先获得其TypedArray对象,然后再从该对象中依次获得指定下标的元素。
Drawable firstPic = userPic.getDrawable(0);
res/values/style
Style资源可以设置layout视图组件中某一个视图元素的样式;该资源文件位于res/values目录下,文件名自定义
<resources>
<style name="CustomText">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#FF4081</item>
</style>
</resources>
<style>
元素中parent属性表明该样式继承的父级元素样式。
在布局控件中使用该style
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
style="@style/CustomText" />
res/values/theme
Theme资源可以设置Activity窗口的样式;该资源文件位于res/values/目录下,文件名自定义。
- Theme资源对某个Activity或整个Application起作用,而不是单独的视图组件。
- Theme主题主要用来设置应用窗口的特征信息(如窗口标题、窗口背景、窗口边框等)。
Theme资源的使用需要从两个角度考虑:
- 在res/values/目录中定义主题资源文件。
- 在AndroidManifest.xml文件或Activity中为整个Activity或整个Application应用主题
<resources>
<style name="CustomTheme" parent="AppTheme">
<item name="windowNoTitle">true</item>
<item name="android:colorBackground">
@color/custom_theme_color</item>
</style>
</resources>
为应用程序应用主题:
- 在AndroidManifest.xml文件静态绑定:
- 可以为
<application>
元素添加android:theme
属性,属性值即为用户刚才所设计的theme资源(@style/CustomTheme
)。 - 可以为
<activity>
元素添加android:theme
属性,属性值即为用户刚才所设计的theme资源(@style/CustomTheme
)。
- 可以为
- 在Activity文件中动态绑定主题:
- 使用Activity类的
setTheme( R.style.CustomTheme )
方法。 - 该方法必须在
setContentView( )
方法或getLayoutInflate( ).inflate( )
方法之前被调用。
- 使用Activity类的
res/mipmap/
在res/目录下默认情况有六个mipmap子目录。
- res/mipmap-anydpi-v26 : API26及以上使用自适应图标
- res/mipmap-mdpi: 中分辨率图标
- res/mipmap-hdpi、mipmap-xhdpi、mipmap-xxhdpi、mipmap-xxxhdpi: 高分辨率图标
这六个子目录中的图片名可以完全相同,Android应用会根据用户设备分辨率的不同而自行选择。
res/drawable/
类型 | 描述 |
---|---|
Bitmap File | 图片文件资源 |
9-patch File | 基于适应内容而自动伸缩的图片(扩展名是 .9.png) |
Layer List | 一个XML文件,管理一系列图片资源的特殊资源 |
State List | 一个XML文件,针对视图控件不同状态而设置的特殊drawable类型 |
Level List | 一个XML文件,根据视图控件不同等级而现实不同的drawable资源 |
Shape Drawable | 一个XML文件,定义包含颜色和渐变的几何图形 |
Scale Drawable | 一个XML文件,根据当前对准值作相应的平铺处理 |
Transition Drawable | 一个XML文件,用两张图片形成一个渐变效果的drawable资源 |
res/xml/
在res/xml/目录下的XML文件为任意规范的XML文档,这些文档没有其它附加意义,仅仅是存储数据或展示数据。
这些XML文档,不能在其它XML资源中引用。
在Activity中,可以使用Resources对象的getXML()方法,加载到内置的XML解析器中,以方便处理。
该类资源的一个典型应用是:存储应用中使用到的配置信息。
res/raw/
res/raw/目录存储任意原始格式的文件(可能为.txt、.mp3、.flv等等)。
该目录下的文件,一般不能使用在其它XML资源中。
该目录中的文件,同样会被R类所索引;因此在Activity中可以使用R.raw.***
方式引用资源;通过Resources对象的openRawResource()
方法,可以获得原始对象的输入流,以方便后续使用。
Assets目录
assets目录:无法直接访问的原生资源(只能通过AssetManager来处理)。
Android Studio创建的项目中,默认不包含assets目录,需要手动创建。在res
同级目录创建assets
目录
- assets目录中可以建立子目录,建立更灵活的目录结构。
- assets目录中的文件格式是任意的,不一定必须是XML文件。
- assets/目录下文件不会被R类索引,即assets/目录下资源不能使用Resources对象获取。
- assets/目录下资源不会被打包到APK中,即assets目录中适合存放过大的文件。
- assets目录下的资源不会被R类处理,因此不能使用res目录下资源的访问方式来访问。
- 在Java代码中,一般是通过getAssets( )方法获得AssetManager对象,然后再加载指定资源,处理该资源。
AssetManager assetManager = getAssets();
try {
InputStream is = assetManager.open("test.txt");
} catch (IOException e) {
e.printStackTrace();
}
在Android中使用assets目录下资源:
-
AssetManager对象中的常用方法:
方法名 描述 String[] list(String path) 返回path目录下所有文件组成的字符串数组形式(若path为空,则表示assets目录) InputStream open(String filename) 打开指定fileName表示的文件流,返回该输入流 XmlResourceParser openXmlResourceParser(String filename) 从assets目录下的fileName文件中加载XML解析器 void close() 关闭当前AssetManager对象