动机:程序的某个Activity中有一个ListView,ListView的每行视图中都有ImageView,程序初始化后,通过Adapter向ImageView中加载图片,现在的需求是,点击该图片能够发送notification通知消息,消息的图标为点击的图片,现在问题来了,如何在给NotificationCompat.Builder设置setSmallIcon时填入ImageView中图片的ID?
上网搜索一番后无果,于是想到在给ImageView加载图片时似乎传入了一个图片ID(iv_cheat_icon.setImageResource(user.getHeadImage()); 注:iv_cheat_icon是一个ImageView, user.getHeadImage()是一个图片的id(R.mipmap.tupian)),于是打开ImageView源码中的setImageResource(int resId)的源码:
public void setImageResource(@DrawableRes int resId) {
// The resource configuration may have changed, so we should always
// try to load the resource even if the resId hasn't changed.
final int oldWidth = mDrawableWidth;
final int oldHeight = mDrawableHeight;
updateDrawable(null);
mResource = resId;
mUri = null;
resolveUri();
if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
requestLayout();
}
invalidate();
}
原来我们传的id赋给了一个叫做mResource的属性,往上翻了翻,发现这是一个私有属性,于是翻了一遍方法,可惜没有获得该属性的方法,于是便只有用反射来获取了,下面代码中红色部分就是获取该ImageView中图片ID的方法,imgid就是我们的结果。感兴趣的可以试试。
Field[] fields=iv_cheat_icon.getClass().getDeclaredFields();
int imgid=0;
for(Field f:fields){
if(f.getName().equals("mResource")){
f.setAccessible(true);