如何将数据库中BitmapDrawable字符串引用设为ImageView背景?
如何通过Drawable的toString字符串设置ImageView背景?
嘿,这个问题我之前帮开发者解决过好几次,先给你把核心逻辑理明白:你存储的android.graphics.drawable.BitmapDrawable@9d0968b0根本不是什么可复用的对象引用——它只是BitmapDrawable实例调用toString()后输出的字符串,本质是类名加上对象的哈希码,完全没法直接用来恢复原Drawable对象。
下面分两种场景给你解决方案:
场景1:需要长期复用(跨进程/重启后仍可用)
这种情况你绝对不能存这个toString结果,而是要存储Bitmap的原始来源信息,比如:
- 若Drawable来自res资源:存储资源名称(如
"my_bg")或者直接存资源ID数值 - 若来自本地文件:存储文件的绝对路径
- 若来自网络:存储图片URL或本地缓存路径
之后在需要设置背景时,根据存储的信息重新加载Drawable:
// 示例1:从资源名称加载 int resId = getResources().getIdentifier("my_bg", "drawable", getPackageName()); Drawable drawable = getResources().getDrawable(resId); myImageView.setBackground(drawable); // 示例2:从本地文件路径加载 File bgFile = new File(yourStoredFilePath); Bitmap bitmap = BitmapFactory.decodeFile(bgFile.getAbsolutePath()); BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap); myImageView.setBackground(drawable);
场景2:仅限当前进程内复用
如果这个BitmapDrawable还在内存中没被GC回收,你可以用内存缓存来保存对象引用,而不是存字符串。比如写个简单的全局缓存类:
// 全局Drawable缓存类 public class DrawableCache { private static final HashMap<String, Drawable> sDrawableCache = new HashMap<>(); public static void saveDrawable(String cacheKey, Drawable drawable) { sDrawableCache.put(cacheKey, drawable); } public static Drawable getCachedDrawable(String cacheKey) { return sDrawableCache.get(cacheKey); } } // 创建Drawable时存入缓存 BitmapDrawable targetDrawable = ...; // 你的Drawable实例 DrawableCache.saveDrawable("my_background", targetDrawable); // 需要设置背景时从缓存取出 Drawable cachedDrawable = DrawableCache.getCachedDrawable("my_background"); if (cachedDrawable != null) { myImageView.setBackground(cachedDrawable); }
补充说明:为什么那个字符串没用?
再敲个重点:BitmapDrawable@9d0968b0里的9d0968b0是对象的哈希码,它只是JVM用来区分不同对象的标识,既不是内存地址,也不能通过这个字符串反序列化出原对象。一旦对象被垃圾回收,这个字符串就彻底成了无效的“空标签”。
内容的提问来源于stack exchange,提问作者David Concha
相关产品推荐
相关产品推荐

