You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中ImageView无法更新图片且加载资源时应用崩溃求助

嘿,我来帮你解决这个问题!咱们先优先搞定最头疼的崩溃,再顺带着解决ImageView不更新和跳过无资源条目的需求~

问题拆解与解决方案

1. 先搞定核心的崩溃问题

崩溃的根源几乎可以肯定是:你尝试加载不存在的drawable资源时,抛出了Resources.NotFoundException,刚好在处理银行相关条目时触发了这个异常。咱们可以通过两种方式解决:

方式一:先检查资源是否存在(推荐)

写一个工具方法,提前判断对应的drawable资源ID是否有效:

// Kotlin 示例
fun getValidDrawableResId(context: Context, drawableName: String): Int {
    return context.resources.getIdentifier(
        drawableName,
        "drawable",
        context.packageName
    ).takeIf { it != 0 } ?: -1 // 不存在就返回-1
}
// Java 示例
public static int getValidDrawableResId(Context context, String drawableName) {
    int resId = context.getResources().getIdentifier(
        drawableName,
        "drawable",
        context.getPackageName()
    );
    return resId != 0 ? resId : -1;
}

然后在使用时先做判断:

val bankDrawableResId = getValidDrawableResId(context, bankItem.drawableName)
if (bankDrawableResId != -1) {
    yourImageView.setImageResource(bankDrawableResId)
} else {
    // 无资源时的处理:比如设置默认图标,或者直接跳过这个条目
    yourImageView.setImageResource(R.drawable.default_bank_icon)
    // 如果是列表场景,这里可以不把该条目加入展示列表
}

方式二:捕获异常(兜底方案)

如果担心某些特殊场景下资源检查没覆盖到,可以加个异常捕获:

try {
    val resId = context.resources.getIdentifier(bankItem.drawableName, "drawable", context.packageName)
    yourImageView.setImageResource(resId)
} catch (e: Resources.NotFoundException) {
    Log.e("DrawableLoader", "找不到银行图标资源: ${bankItem.drawableName}", e)
    // 兜底处理:设置默认图或跳过条目
    yourImageView.setImageResource(R.drawable.default_bank_icon)
}

2. 解决ImageView不更新的问题

如果资源确实存在,但ImageView没刷新,可能是这几个原因:

  • 非主线程更新UI:必须确保setImageResource是在主线程调用的,比如用Coroutine的主线程调度器,或者Activity的runOnUiThread:
    // Kotlin 用Coroutine示例
    lifecycleScope.launch(Dispatchers.Main) {
        yourImageView.setImageResource(bankDrawableResId)
    }
    
  • 列表复用问题:如果是RecyclerView/ListView,要在onBindViewHolder里重置ImageView状态,避免复用旧条目残留的资源。
  • 资源名大小写问题:drawable资源名是区分大小写的!比如Bank_Icon和bank_icon是两个完全不同的资源,要确保你的名称和实际文件名完全一致。

3. 批量处理时跳过无资源条目

如果是遍历大量条目,想直接跳过没有对应资源的,只需要在数据源层面过滤:

// 假设allBankItems是你的原始条目列表
val validBankItems = allBankItems.filter { bankItem ->
    getValidDrawableResId(context, bankItem.drawableName) != -1
}
// 之后只用validBankItems来加载列表,就自动跳过无资源的条目了

内容的提问来源于stack exchange,提问作者Rokas Ščesnavičius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:20:44