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

继承AppCompatImageView的自定义View使用app:srcCompat不显示图片问题

问题原因排查及解决方案

导致该问题的常见原因按排查优先级整理如下:

  • 构造函数参数传递错误
    你当前显式声明的三个构造函数没有传递AppCompatImageView默认的样式参数,会导致属性解析异常。推荐采用Kotlin官方推荐的自定义View构造写法,加上@JvmOverloads注解同时传入默认样式参数:

    class BadgeImageView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = R.attr.imageViewStyle
    ) : AppCompatImageView(context, attrs, defStyleAttr)
    

    替换你原来的三个显式构造函数即可,该写法可以覆盖所有inflater调用场景,避免构造函数匹配异常。

  • srcCompat属性未被正确解析
    如果修改构造函数后问题依然存在,说明xml中的app:srcCompat属性没有被自定义View正确读取,你可以在构造函数的init代码块中手动解析该属性:

    init {
        attrs?.let {
            val typedArray = context.obtainStyledAttributes(it, androidx.appcompat.R.styleable.AppCompatImageView, defStyleAttr, 0)
            val srcDrawable = typedArray.getDrawable(androidx.appcompat.R.styleable.AppCompatImageView_srcCompat)
            srcDrawable?.let { drawable ->
                setImageDrawable(drawable)
            }
            typedArray.recycle()
        }
    }
    
  • 其他验证方案
    你可以先做两个快速验证缩小问题范围:

    1. 给BadgeImageView添加android:background="#FF0000"属性,运行后如果红色背景正常显示,说明View本身布局测量正常,问题出在drawable加载逻辑;如果背景也不显示,需要检查自定义View的包名是否和布局中声明的完全一致、是否重写了onMeasure方法导致测量结果为0。
    2. 将布局中的app:srcCompat替换为android:src,如果替换后图片正常显示,说明是矢量图支持库和自定义View的适配问题,确认模块build.gradle中已经开启了矢量图支持配置:
      android {
          defaultConfig {
              vectorDrawables.useSupportLibrary = true
          }
      }
      

内容的提问来源于stack exchange,提问作者recsater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:15:07