在我们自定义ImageView的时候往往会遇到下面这个bug
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.drawable.BitmapDrawable.getBitmap()' on a null object reference
感觉摸不到头脑,所以只能看看源码了,点进去看到:
* Gets the current Drawable, or null if no Drawable has been
* assigned.
*
@return
the view's drawable, or null if no drawable has been
* assigned.
public
Drawable
getDrawable
() {
if
(mDrawable == mRecycleableBitmapDrawable) {
mRecycleableBitmapDrawable =
null
;
return
mDrawable;
代码很简单,大概知道是怎么会是了,要找到原因就要先找到mRecycleableBitmapDrawable这个东东,看它是在什么时候赋值的,诶找到了:
* Sets a Bitmap as the content of this ImageView.
*
@param
bm The bitmap to set
@android
.view.RemotableViewMethod
public
void
setImageBitmap
(Bitmap bm) {
mDrawable =
null
;
if
(mRecycleableBitmapDrawable ==
null
) {
mRecycleableBitmapDrawable =
new
BitmapDrawable(mContext.getResources(), bm);
}
else
{
mRecycleableBitmapDrawable.setBitmap(bm);
setImageDrawable(mRecycleableBitmapDrawable);
看到了这个方法setImageBitmap(Bitmap bm),是不是很眼熟,那这个方法是啥时候用,它对应的是xml布局文件中的什么东东呢,答案就是android_src=”“;好了看看你的xml代码是用src设置的图片还是background呢,如果是background那返回的就是null了
在我们自定义ImageView的时候往往会遇到下面这个bugjava.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.drawable.BitmapDrawable.getBitmap()' on a null object referen...
一款手机便宜签,实现存储文本和图片。
String title = title_edt.getText().toString();
String content = content_edt.getText().toString();
ContentValues values = new ContentValues();
if (img_iv.get
Drawable
() !=
null
) {
img_iv.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(img_iv.getDrawingCache());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 100, bos);
values.put("img", bos.toByteArray());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time = sdf.format(new Date());
db = myHelper.getWritableDatabase();
values.put("title", title);
if (content !=
null
) {
values.put("content", content);
values.put("time", time);
if (!title.equals("")) {
db.insert("note",
null
, values);
db.close();
EditActivity.this.finish();
drawable
= ContextCompat.get
Drawable
(getContext(), R.mipmap.xxx);
set
Drawable
(
Drawable
TextView.LEFT,
drawable
, width, height);
Customizable attributes
xml中定义了以下属性
Define xmlns:app="http://schemas.
android
.com/apk/res-auto" on root of your xml file
<deadline.
Drawable
TextView
android
:layout_width="100dp"
android
:layout_height="wrap_content"
android
:layout_gravity="center_horizontal"
android
:
drawable
Padding="5dp"
app:bottom
Drawable
="@mipmap/camera"
app:bottom
Drawable
Height="20dp"
app:bottom
Drawable
Width="20dp"
app:left
Drawable
="@mipmap/camera"
app:left
Drawable
Height="20dp"
app:left
Drawable
Width="20dp"
app:right
Drawable
="@mipmap/camera"
app:right
Drawable
Height="20dp"
app:right
Drawable
Width="20dp"
app:top
Drawable
="@mipmap/camera"
app:top
Drawable
Height="20dp"
app:top
Drawable
Width="20dp"/>
context.getResources().get
Drawable
(R.mipmap.icon_my);
官方推荐调用
context.getResources().get
Drawable
(R.mipmap.icon_my,theme);
只是过时了,并不影响使用,只是在特殊情况下,在
Android
4.1系统之前加载缩略图可能会出现异常,所以被谷歌废弃了。建议用以下方法代替:
我们经常通过getContext().getResources().get
Drawable
()来获取一个问题,当因为
Android
机制使用了缓存机制,直接setColorFilter()修改颜色,可能同时也会改变其他get
Drawable
()的颜色。
我们先来看一下get
Drawable
()的源码吧。
public
Drawable
get
Drawable
(int id, @
Null
a...
Android
SDK 升級到23后
getResource.getColor(R.color.color_name),getResources().get
Drawable
(R.
drawable
.
drawable
_name)过时不推荐使用;
解决方法:
使用新加入的方法ContextCompat.getColor(context,R.color.color_name)和 Contex
if (userHeaderImage.get
Drawable
()==
null
){
ToastUtils.show(VertifyInfoActivity.this,"头像信息不存在");
}else {
goCamera();
之前代码中获取
Drawable
都是使用如下方法:
Drawable
Top
Drawable
One = getResources().get
Drawable
(R.
drawable
.icon_test);
但是此方法过时,不推荐使用,那么肯定是有其他替代方法的,经过查找,很多网友都是推荐使用
Drawable
get
Drawable
(int id, Resources.Theme the
Android
SDK 升級到 23 之後,getResource.getColor(R.color.color_name) 過時,可以使用新加入的方法 ContextCompat.getColor(context, R.color.color_name) 。
当你这个
Drawable
不受主题影响时
ResourcesCompat.get
Drawable
(getResources(), R.
drawable
.name,
null
);
当你这个
Drawable
受当前Activity主题的影响时
ContextCompat.get
Drawable
(getActivity(), R.
drawable
.name);
当你这个Drawabl
之前使用这个方法的时候看见它过时,认为不会引起错误。在小米,华为,oppo,联想手机上测试也并未产生任何问题。直到有一次公司拿着公司同事的锤子手机(系统版本是4.4.2)。突然发现程序崩溃,查找错误日志提示是get
Drawable
()这个方法找不到,才意识到过时也有可能引起问题。随后将它改为谷歌推荐的方法代替。
ContextCompat.get
Drawable
(context,R.mipmap
转自http://www.cnblogs.com/devinzhang/archive/2012/06/05/2536848.html方法public static Bitmap convertViewToBitmap(View view) {
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
在将图片用get
drawable
的方法转换成bitmap时会出现OOM,下面的方法就是怎么去避免因为这种操作或类似操作而引起的OOM。
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decod
get
Drawable
()是
Android
中的一个方法,用于从资源中获取
Drawable
对象。它接受一个资源ID作为参数,并
返回
一个
Drawable
对象。例如,以下代码会从应用程序的资源中获取一个名为"my_
drawable
"的
Drawable
对象:
Drawable
drawable
= getResources().get
Drawable
(R.
drawable
.my_
drawable
);
请注意,这个方法在API level 22(即
Android
5.1)及以下版本中已经被弃用,取而代之的是使用ContextCompat.get
Drawable
()或ViewCompat.get
Drawable
()方法。如果您的应用程序需要与较旧的
Android
版本兼容,则可以使用以下代码来获取
Drawable
对象:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Drawable
drawable
= getResources().get
Drawable
(R.
drawable
.my_
drawable
, getTheme());
} else {
Drawable
drawable
= getResources().get
Drawable
(R.
drawable
.my_
drawable
);
这样,在API level 22及以下版本中,将使用旧的get
Drawable
()方法获取
Drawable
对象,在API level 23及以上版本中,则使用新的get
Drawable
()方法获取
Drawable
对象。