Android资源文件在配置文件中的使用

2023-05-16

Android资源文件大致可以分为两种:

第一种是res目录下存放的可编译的资源文件:

这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可;

第二种是assets目录下存放的原生资源文件:

因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们。那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.apk目录下,以apk形式存在,asset/res和被绑定在apk里,并不会解压到/data/data/YourApp目录下去,所以我们无法直接获取到assets的绝对路径,因为它们根本就没有。

还好android系统为我们提供了一个AssetManager工具类。

查看官方API可知,AssetManager提供对应用程序的原始资源文件进行访问;这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。   

Android除了提供/res目录存放资源文件外,在/assets目录也会提供存放资源文件,在/assets目录下面不会在R.java里面自动生成ID,所以读取assets目录下面的资源文件需要提供路径,我们可以通过AssetManager类来访问这些文件。

 

assets文件夹资源的访问

assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。

      1. 先在Activity里面调用getAssets() 来获取AssetManager引用。

      2. 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStream。 

      3. 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStream.close() 。

      4.调用AssetManager.close() 关闭AssetManager。

 

需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作
以下为从Raw文件中读取:
代码


   
  1. public String getFromRaw(){

  2. try {

  3. InputStreamReader inputReader = new InputStreamReader( getResources().openRawResource(R.raw.test1));

  4. BufferedReader bufReader = new BufferedReader(inputReader);

  5. String line="";

  6. String Result="";

  7. while((line = bufReader.readLine()) != null)

  8. Result += line;

  9. return Result;

  10. } catch (Exception e) {

  11. e.printStackTrace();

  12. }

  13. }

  14. 以下为直接从assets读取

  15. 代码

  16. public String getFromAssets(String fileName){

  17. try {

  18. InputStreamReader inputReader = new InputStreamReader( getResources().getAssets().open(fileName) );

  19. BufferedReader bufReader = new BufferedReader(inputReader);

  20. String line="";

  21. String Result="";

  22. while((line = bufReader.readLine()) != null)

  23. Result += line;

  24. return Result;

  25. } catch (Exception e) {

  26. e.printStackTrace();

  27. }

  28. }

 

接下来举个例子

我们新建一个工程文件,命名为AssetsDemo。

 

然后建立一个布局文件,如下,很简单,无需我多介绍,大家一看就明白。

然后呢,我从网上找了段文字,存放在assets文件目录下,取名为health.txt 这就是今天我们要读取的文件啦。

health.txt可以自己写点内容放进assets文件夹下就可以了。

接下来,就是今天的重头戏,Android读取文件的核心代码。就直接贴代码了。


   
  1. package com.assets.cn;

  2. import java.io.InputStream;

  3. import org.apache.http.util.EncodingUtils;

  4. import android.app.Activity;

  5. import android.graphics.Color;

  6. import android.os.Bundle;

  7. import android.widget.TextView;

  8. public class AssetsDemoActivity extends Activity {

  9. public static final String ENCODING = "UTF-8";

  10. TextView tv1;

  11. @Override

  12. public void onCreate(Bundle savedInstanceState) {

  13. super.onCreate(savedInstanceState);

  14. setContentView(R.layout.main);

  15.  
  16. tv1 = (TextView)findViewById(R.id.tv1);

  17. tv1.setTextColor(Color.BLACK);

  18. tv1.setTextSize(25.0f);

  19. tv1.setText(getFromAssets("health.txt"));

  20. }

  21.  
  22. //从assets 文件夹中获取文件并读取数据

  23. public String getFromAssets(String fileName){

  24. String result = "";

  25. try {

  26. InputStream in = getResources().getAssets().open(fileName);

  27. //获取文件的字节数

  28. int lenght = in.available();

  29. //创建byte数组

  30. byte[] buffer = new byte[lenght];

  31. //将文件中的数据读到byte数组中

  32. in.read(buffer);

  33. result = EncodingUtils.getString(buffer, ENCODING);

  34. } catch (Exception e) {

  35. e.printStackTrace();

  36. }

  37. return result;

  38. }

  39. }

一、assets和raw目录

1. assets。assets类资源放在工程根目录的assets子目录下,它里面保存的是一些原始的文件,可以以任何方式来进行组织。这些文件最终会被原装不动地打包在apk文件中。如果我们要在程序中访问这些文件,那么就需要指定文件名来访问。例如,假设在assets目录下有一个名称为filename的文件,那么就可以使用以下代码来访问它:

  1. AssetManager am= getAssets();    
  2. InputStream is = assset.open("filename");  

2、raw。raw是res下的子目录, --raw。这类资源以任意格式的文件保存在res/raw目录下,它们和assets类资源一样,都是原装不动地打包在apk文件中的,不过它们会被赋予资源ID,这样我们就可以在程序中通过ID来访问它们。例如,假设在res/raw目录下有一个名称为filename的文件,并且它在编译的过程,被赋予的资源ID为R.raw.filename,那么就可以使用以下代码来访问它:

  1. Resources res = getResources();  
  2. InputStream is = res .openRawResource(R.raw.filename);  

更详细信息可参考大牛神作 http://blog.csdn.net/luoshengyang/article/details/8738877

 

二、其中properties资源文件的读取

1. 如果放入了assets文件夹中,可以如下打开: 

  1. Properties pro = new Properties();

  2. InputStream is = context.getAssets().open("test.properties");

  3. pro.load(is);

2. 如果放入到raw文件夹中,可以通过如下方式打开: 

InputStream is = context.getResources().openRawResource(R.raw.test);

 

3. 如果没有上下文住处,则可用java传统的方式来打开:

  Properties pro = new Properties();

  1. pro.load(FileLoad.class.getResourceAsStream("/assets/test.properties")); //或者/res/raw/test.properties

二、从下图看出四种资源文件的格式与在配置文件中的使用

1.图片资源文件前缀名不能使用大写字母并且不能以数字开头

2.颜色资源文件、尺寸资源文件和字符资源文件所在的目录都必须是values,并且文件名是固定的,

   如下图中示例

3.颜色资源文件、尺寸资源文件和字符资源文件的内容格式如下图示例

4.四种资源文件在布局资源文件中的使用如下图示例, 已经可以使用在AndroidManifest.xml文件中

二、Java代码操作资源文件

1.操作资源文件的对象的获取

     Resources res = context.getResources();  (getResources()实现方法是类Context中声明的方法)

2.strings.xml资源文件被java代码操作

  /** 第一种

  String school =res.getString(R.string.school);// 成都中心大学

  textView.setText(school);

  **/

  /** 第二种

  String school = context.getString(R.string.school);

  textView.setText(school);

  **/

  /**第三种

  textView.setText(R.string.school);

  */

3.colors.xml 资源文件被java代码操作

  int myRed =res.getColor(R.color.my_red); 

  context.textView.setTextColor(myRed);

4. dimens.xml资源文件被java代码操作

  float bigSize = res.getDimension(R.dimen.bigSize);

  textView.setTextSize(bigSize);

 

5.图片资源文件被java代码操作

  (1)设置LinearLayout的背景

  /**第一种

  Drawable bc =res.getDrawable(R.drawable.bc); 

  linearLayout .setBackgroundDrawable(bc);//设置背景图片

  */

  /**第二种

   linearLayout .setBackgroundResource(R.drawable.bc);

 */

  (2)设置ImageView的src

  /**第一种

  Drawable bc = res.getDrawable(R.drawable.xx);

  imageView.setImageDrawable(bc);

  */

  /**第二种

  Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.xx);

  imageView.setImageBitmap(bitmap);

  */

  /**第三种

  imageView.setImageResource(R.drawable.xx);

 */ 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android资源文件在配置文件中的使用 的相关文章

随机推荐

  • c++中字符数组内存和指针问题示例解答

    char id 61 34 123456 34 char c 61 34 SN 61 34 unsigned char buffer 20 int j 61 0 for int i 61 0 i lt strlen c i 43 43 bu
  • c++中LPCTSTR,LPTSTR 解释

    char是C语言标准数据类型 xff0c 字符型 xff0c 至于由几个字节组成通常由编译器决定 xff0c 一般一个字节 Windows为了消除各编译器的差别 xff0c 重新定义了一些数据类型 xff0c 你提到了另外几个类型都是这样
  • Delphi 自定义事件的例子

    我们这个控件将演示控件的自定义事件的书写 这个控件有一个类型为string的SensitiveText属性 xff0c 当用户在输入框中输入的文字为InvalidText时就会触发OnSensitiveText事件 按照惯例 xff0c 我
  • c++中sscanf的用法

    sscanf 读取格式化的字符串中的数据 swscanf 是 sscanf 的宽字符版本 xff1b swscanf 的参数是宽字符串 swscanf不处理 Unicode 全角十六进制或 34 兼容性区 34 字符 除此以外 xff0c
  • c++内存测试

    void MemoryTest 内存测试 指针嵌套 char rr 栈中分配内存 系统自动分配释放 xff09 int ee 61 int amp rr 将rr的内存地址转换成整型数 char yy 61 amp rr 定义一个字符型指针y
  • C/C++串口通信原理及读写与操作

    http wangbaiyuan cn c serial communication write reading html 展开 文章目录 在工业控制中 xff0c 工控机 xff08 一般都基于Windows平台 xff09 经常需要与智
  • c# 调用c库dll ,char*转string的解决办法

    最近由于有个未知的设备需要用到modbus通讯协议 xff0c 底层需要与PLC通讯 xff0c 坤跌 xff0c PLC啥型号也不清楚封在里面不能拆 前人只留了几个不能运行的QT代码以及不完整的文档 用惯了C 想要重新学QT xff0c
  • C++多线程编程(入门实例)

    多线程在编程中有相当重要的地位 xff0c 我们在实际开发时或者找工作面试时总能遇到多线程的问题 xff0c 对多线程的理解程度从一个侧面反映了程序员的编程水平 其实C 43 43 语言本身并没有提供多线程机制 xff08 当然目前C 43
  • Android Studio 使用Log

    Android使用log来记录信息 xff0c 测试了下 xff0c 和system out println区别不大 xff0c 主要优势在于能使用过滤器过滤日志 本文记录基础的log使用方法 xff0c 来自 第一行代码 xff0c 以及
  • 指针强制转换问题

    void ff void abc 任意类型数据指针 xff08 指针即内存地址 xff09 int z 61 int abc 强制转换成int 指针变量 int zz 61 z 获取内存中的值
  • 新手git教程

    本文转载自 xff1a http igeekbar com igeekbar post 82 htm Git近些年的火爆程度非同一般 xff0c 这个版本控制系统被广泛地用在大型开源项目 xff08 比如Linux xff09 xff0c
  • 使用Project进行项目管理

    下面开始介绍Project的使用 1 从下列地址获取Project 2010的副本 版权问题 xff0c 已删除地址 2 安装 2 1 版权页 2 2 自定义安装页 2 3 安装完毕 3 使用该软件进行项目管理 3 1 打开Project
  • Marshal在C#中的应用(void *指针到IntPtr的转化)

    C 调用C语言的API时一般把void 指针转换成IntPtr xff0c 但这经常远远不够的 在C语言中void 是个万金油 xff0c 尤其是一些老的c语言程序 xff0c 所有的参数就一个void 指针 xff0c 里面包罗万象 xf
  • VS2012 2013 无法显示查找功能 无法具体定位 解决方法

    xfeff xfeff 问题的现象 通过使用 Ctrl 43 Shift 43 F 也就是Find In Files功能 xff0c 使用之后只能显示统计结果 不显示具体行 如下图 regedit 中在注册表中查找 xff1a HKEY C
  • C#中使用指针转换数据类型[C#/unsafe]

    今日因为一个同事说起 xff0c 在原来的旧系统中使用指针做数据转换很方便 xff0c 比如要把浮点数转化为数组 xff0c 也或者是字符串的相互转换 xff1b 当然 xff0c 大家都知道c 中实现指针只需要写入unsafe 编译选项把
  • c#指针的使用例程

    unsafe double value 61 888888 byte v1 61 BitConverter GetBytes value byte v2 61 new byte v1 Length double pv 61 amp valu
  • MPAndroidChart LineChart 折线图 你要的都在这里了

    前言 MPAndroidChart已经出了很长的一段时间 xff0c 相信大家也有所耳闻 xff0c 自己也使用了有一段时间 xff0c 固在此写下文章 xff0c 根据项目的需求 xff0c 记录一些见解与问题 xff0c 作为参考 望大
  • Android Chart框架 MPAndroidChart 坐标轴设置

    1 轴线的绘制 设置轴线就先必须取得轴线类Axis 在一个图标中有三个轴线 xff1a x轴 xff1a 调用 getXAxis 获取左边y轴 xff1a 调用 getAxisLeft 获取右边y轴 xff1a 调用 getAxisRigh
  • Android图表控件MPAndroidChart——曲线图LineChart的使用(财富收益图)

    目录 前言 本文涉及文章 其他相关文章 1 数据准备 1 1 数据来源 2 曲线展示 2 1 MPAndroidChart获取 2 2 数据对象获取 2 3 数据展示 3 曲线完善 3 1 图表背景 边框 网格线修改 3 2 X Y轴值的自
  • Android资源文件在配置文件中的使用

    Android资源文件大致可以分为两种 xff1a 第一种是res目录下存放的可编译的资源文件 xff1a 这种资源文件系统会在R Java里面自动生成该资源文件的ID xff0c 所以访问这种资源文件比较简单 xff0c 通过R XXX