Vector Drawable在Activity正常但RecyclerView中崩溃问题求助
这个问题我之前帮不少开发者排查过,结合你已经做的尝试,咱们从几个关键点再梳理下:
确保Adapter中使用的Context有效且正确
你提到传递了Activity引用给Adapter,但要注意:如果Activity已经进入销毁状态,这个引用可能会失效甚至引发内存泄漏。更稳妥的方式是在onBindViewHolder中通过holder.itemView.getContext()获取当前有效的Context,再调用ContextCompat.getDrawable():Drawable drawable = ContextCompat.getDrawable(holder.itemView.getContext(), R.drawable.ic_home_team); holder.ivTeam.setImageDrawable(drawable);另外,别用Application Context来加载Vector Drawable——它没有关联Activity的主题,可能导致资源解析失败。
检查Vector Drawable文件的语法规范
报错里提到的res/drawable/test.xml可能存在语法问题:AndroidX环境下,Vector Drawable的核心属性要使用app命名空间,而不是android命名空间。比如:<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" app:viewportWidth="24" app:viewportHeight="24" android:width="24dp" android:height="24dp"> <path app:pathData="M12..." android:fillColor="@color/black"/> </vector>如果误用了
android:前缀的viewportWidth/pathData等属性,就可能在非Activity场景下解析失败。调整AppCompatDelegate的初始化时机
你在Adapter里加静态代码块的方式可能时机不对,建议把AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);移到自定义Application类的onCreate()方法中,确保App启动时就开启Vector Drawable兼容:public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } }别忘了在
AndroidManifest.xml里指定这个Application类。替换为AppCompatImageView
把Recycler Item布局里的普通ImageView换成androidx.appcompat.widget.AppCompatImageView,它对Vector Drawable的兼容支持更完善。之后可以直接调用setImageResource(),无需手动获取Drawable:holder.ivTeam.setImageResource(R.drawable.ic_home_team);AppCompatImageView会自动处理Vector Drawable的适配,避免Context相关的问题。
排查资源引用的一致性
确认Adapter中引用的Drawable ID(比如R.drawable.ic_home_team)和你实际的资源文件名完全一致,Android系统对资源文件名大小写敏感,别出现文件名和引用不匹配的情况。
内容的提问来源于stack exchange,提问作者dev90

