继承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() } }其他验证方案
你可以先做两个快速验证缩小问题范围:- 给BadgeImageView添加
android:background="#FF0000"属性,运行后如果红色背景正常显示,说明View本身布局测量正常,问题出在drawable加载逻辑;如果背景也不显示,需要检查自定义View的包名是否和布局中声明的完全一致、是否重写了onMeasure方法导致测量结果为0。 - 将布局中的
app:srcCompat替换为android:src,如果替换后图片正常显示,说明是矢量图支持库和自定义View的适配问题,确认模块build.gradle中已经开启了矢量图支持配置:android { defaultConfig { vectorDrawables.useSupportLibrary = true } }
- 给BadgeImageView添加
内容的提问来源于stack exchange,提问作者recsater
相关产品推荐
相关产品推荐

