Android 自定义View 在 XML文件中使用脱坑

本文主要是针对自定义 View 在 XML 中使用时,出现的 android.view.InflateException :Error inflating class xxx


解决这个问题,首先要做的不是谷歌百度,最先该做的是打开的 logcat 面板,搜索自定义 View 的类名,查看异常日志。


如果在异常日志中发现这样一行异常代码

java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]


那你代码问题就石锤了,必定是少了构造方法,想在 XML 布局文件中使用自定义 View,那么至少要实现前两个默认构造方法。


这里我们提一下自定义 View 中的三个构造方法
当你在代码中直接创建这个自定义 View 时,会走到这个构造方法中

public View (Context context)


这个是在 XML 创建但是没有指定 style 的时候被调用

public View (Context context, AttributeSet attrs)


给 View 提供一个基本的 style ,如果我们没有对 View 设置某些属性,就使用这个 style 中的属性。

public View (Context context, AttributeSet attrs, int defStyle)

本文的重点来了

现在我们说一种特殊情况,你的自定义 View 在布局中,此时你在代码里 inflate 了这个布局,出现 InflateException

如果你的自定义 View并没有少实现构造方法,并且在异常日志中看到你的自定 View 类名 ClassNotFoundException 这个异常上报,
那么很有可能是你在 inflate 函数中传的 Context 实体,拿不到你自定义 View 上面的资源,
这时你将普通的 Context 换成 ApplicationContext 就基本可以解决这个问题。


最后提一下,笔者是在插件化的一个插件中发现此问题,自定义 View 要在一个 fragment 中 inflate 出来,这里如果不传 ApplicationContext 的话就会出现 ClassNotFoundException 这个问题。

推荐一个公众号,不吐槽,不毒舌,偶尔发发文章,偶尔推荐好物,欢迎关注或者有女票的程序狗们推荐给女票

这里写图片描述

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭