Android --- bitmapfactory 使用getResources()小结

本文详细介绍了在Android开发中使用getResources()函数获取资源的方法,包括资源文件的引用、XML文件的加载、RAW文件的读取、drawable目录下图片的解码等,并解决了非Activity类引用getResources()方法的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------

开发中经常用到 getResources() 函数,开始不知道如何使用 res 或者 assets 的文件,现在终于知道了其用法,记录下来以便有朋友能使用到。Android --- bitmapfactory 使用getResources()小结
概要说明:
数据包package:android.content.res
主要类:Resources
InputStream openRawResource(int id) 获取资源的数据流,读取资源数据
把一个图片资源,添加你的文件到你工程中res/drawable/目录中去,可以在代码或XML布局中,引用它也可以用资源编号,比如你选择一个文件只要去掉后缀就可以了(例如:mmm_image.png 引用它是就是mm_image)。
当需要使用的xml资源的时候,就可以使用context.getResources().getDrawable(R....资源的地址如:R.String.ok);
当你方法里面没有Context参数,可以 this.getContext().getResources();这样就可以了。
下面详细说明一下使用场景:
1、需要使用getResource()的时候一定要注意
必须要有Context, 这个一般的service或者activity即带有
可以用作成员变量,构造传入或方法参数传入就可以了
2、引用xml文件时,可能通过:
getResources().getXml()获的XML原始文件,然后再得到XmlResourceParser对象
XmlResourceParser xrp = mRes.getXml(R.xml.personal);

而利用R....可以指定文件夹下面的某个xml文件进行加载使用


3、其它的一些文件读取方法
a、把资源文件放到应用程序的/raw/raw下,那么就可以在应用中使用getResources获取资源后,

以openRawResource方法(不带后缀的资源文件名)打开这个文件



1
2

Resources myResources = getResources();
InputStream myFile = myResources.openRawResource(R.raw.xx_filename);

与普通java程序一样,android提供了openFileInput和openFileOutput方法来读取设备上的文件



1
2
3

InputStream fs =
this
.getResources().openRawResource(R.raw.index.htm); (资源文件名为index.html, 不需要带后缀.htm)
InputStreamReader read =
new
InputStreamReader (fs,
"utf-8"
);
BufferedReader
in
=
new
BufferedReader(read);

b、读取res/drawable目录下的png或者bmp



1
2
3
4
5
6

//得到Resources对象
Resources r =
this
.getContext().getResources();
//以数据流的方式读取资源
Inputstream is = r.openRawResource(R.drawable.mm_image);
BitmapDrawable bmpDraw =
new
BitmapDrawable(is);
Bitmap bmp = bmpDraw.getBitmap();

如果需要利用图片解码器,如下使用:



1
2
3
4

InputStream is = getResources().openRawResource(R.drawable.icon);
Bitmap mBitmap = BitmapFactory.decodeStream(is);
Paint mPaint =
new
Paint();
canvas.drawBitmap(mBitmap, 40, 40, mPaint);
-----------------------------------------
非Activity类引用getResources()方法问题的解决方法
-----------------

From:http://blog.youkuaiyun.com/xyzjl/article/details/9285093

在进行Android开发的过程中,在一个非Activity类(此处假设类名为MyNewClass)中引用了getResources()方法,如下:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.marker_red);

结果错误信息提示:MyNewClass.class中没有getResources()方法。

在百度和Google上各种寻找,没有合适的解决办法。

有人这么解决:

可以传递指针给你的activity,在其中你调用getApplicationContext()方法就行了,或者你想用getContext()也可以。


一、改为Bitmap bmp = BitmapFactory.decodeResource(Context.getResources(), R.drawable.marker_red);和Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.marker_red);都不行。

如果你试了,就知道不行(反正我的不行,但是如果在Activity类中应该是可以的)。

二、在Acitivity里面作如下改动:

public static Resources resourcesInstance;
resourcesInstance=this.getResources();

MyNewClass.class这么引用:

Bitmap bitmap = BitmapFactory.decodeResource(MyActivity.resourcesInstance, R.drawable.test);
这样来,代码没有错,但是是出现了NullPointerException的程序运行崩溃的情况。

虽然问题没有解决,但是看到这样两句话:

在类的构造函数中传一个Context(如Activity或者Application,Service)进来”和“android.content.Context,getResources建立在Activity基础之上”。

受此启发,找到两种解决办法:

方法一:在MyNewClass.class中创建getResources()方法:

private Resources getResources() {
// TODO Auto-generated method stub
Resources mResources = null;
mResources = getResources();
return mResources;
}

你会发现错误没有了,而且运行结果正常。

方法二:在MyActivity.class的构造函数中进行Context传递。声明一个Context,并且构造方法getContext()。具体代码如下:

在MyActivity.class中进行Context传递:

public class MyActivity extends Activity {
       ……

       ……
private static Context Context = null;
……

       ……
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

                setContentView(R.layout.view);

        ……

       ……

      public static Context getContext() {
return Context;
}

在MyNewClass.class进行方法的引用:

Bitmap bmp = BitmapFactory.decodeResource(MyActivity.getContext().getResources(), R.drawable.marker_red);


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以上,就是针对自己创建的非Activity类引用getResources()方法问题的解决方法。

顺便附一片帖子,关于Context的。http://www.360doc.com/content/11/0430/11/4154133_113336620.shtm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值