Android改用MaterialButton报Error inflating class <unknown>错误
崩溃根因
这个Error inflating class <unknown>本质是MaterialButton控件初始化失败,和你贴的适配器构造代码本身无关——报错定位到适配器,只是因为RecyclerView在onCreateViewHolder流程中加载item布局,崩溃刚好落在这个调用链上。
高频触发原因共两类:
- 加载布局用的
Context没有使用Theme.MaterialComponents系列主题。所有Material组件要求依附的上下文必须匹配Material主题,否则控件构造阶段直接抛异常 - 直接通过
android:background属性给MaterialButton传入自定义drawable/覆盖样式。MaterialButton默认用内部的MaterialShapeDrawable实现背景逻辑,直接替换原生background属性会打破内部状态管理、绘制逻辑,触发初始化崩溃。
解决方案
按以下顺序排查修复:
- 检查App/对应加载该布局的Activity使用的主题,父类必须是MaterialComponents系列,示例:
不想全局替换主题的话,可以给MaterialButton单独指定主题:<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"> <!-- 其余自定义主题属性 --> </style><com.google.android.material.button.MaterialButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:theme="@style/Theme.MaterialComponents.Light" /> - 不要用
android:background给MaterialButton设置自定义样式,改用组件自带属性实现效果:- 圆角、描边、填充色分别用
app:cornerRadius、app:strokeColor、app:strokeWidth、app:backgroundTint配置 - 需要自定义形状的话,用
app:shapeAppearance关联自定义shape样式,不要直接传drawable - 必须用自定义drawable做背景的话,两种选择:要么把material依赖升级到1.4.0及以上版本(该版本后才正式支持android:background属性),要么换回
AppCompatButton使用
- 圆角、描边、填充色分别用
- 确认适配器里inflate item布局传入的Context是当前Activity实例,不要传Application级别的Context——Application上下文没有绑定页面主题配置,会导致Material控件拿不到需要的主题属性,初始化失败。
问题相关报错信息
报错指向代码段
public RecycleViewCustomAdapter(Context context, ArrayList<bigModel> ModelArrayList) { this.context = context; this.ModelArrayList = ModelArrayList;
完整崩溃日志
118 27852-27852/com.a.b E/AndroidRuntime: FATAL EXCEPTION: main Process: com.a.b, PID: 27852 android.view.InflateException: Binary XML file line #236 in com.a.b:layout/saved_job_recycleview: Binary XML file line #236 in com.a.b:layout/saved_job_recycleview: Error inflating class <unknown> Caused by: android.view.InflateException: Binary XML file line #236 in com.a.b:layout/saved_job_recycleview: Error inflating class <unknown> Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:343) at android.view.LayoutInflater.createView(LayoutInflater.java:858) android.view.LayoutInflater.rInflate(LayoutInflater.java:1130) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1088) at android.view.LayoutInflater.inflate(LayoutInflater.java:686) at android.view.LayoutInflater.inflate(LayoutInflater.java:538)
报错截图



内容的提问来源于stack exchange,提问作者Anusha C
相关产品推荐
相关产品推荐

