Android应用因Error inflating class <unknown>崩溃,主题属性解析异常求助
Android InflateException 无法解析自定义主题属性:问题原因与解决方案
问题原因
你在布局中使用?attr/textColor引用的是自定义主题属性,而非Android系统原生的主题属性。系统主题(如Theme.DeviceDefault.Light.DarkActionBar)并未声明这个自定义属性,当布局被使用系统主题的Context加载时,系统无法找到该属性的定义,从而抛出InflateException。
注意:Android系统自带的文本颜色属性是android:textColor,你自定义的textColor属于无前缀的自定义命名空间属性,仅你的自定义主题能识别。
解决方案
以下几种方案均无需修改系统主题,也不用将所有颜色引用迁移到Java代码:
方案1:改用系统兼容的属性命名(推荐)
将自定义主题中的属性改为系统原生的android:textColor,同时修改布局中的引用,这样系统主题和自定义主题都能识别该属性:
修改styles.xml:
<resources xmlns:tools="http://schemas.android.com/tools"> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:textColor">#20282D</item> </style> <style name="AppThemeLight" parent="AppTheme"> <item name="android:textColor">#20282D</item> </style> <style name="AppThemeDark" parent="AppTheme"> <item name="android:textColor">#FFFFFF</item> </style> </resources>
修改布局中的TextView引用:
<TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textColor="?android:attr/textColor" />
方案2:声明自定义属性并设置默认值
如果不想改用系统属性,可在res/values/attrs.xml中声明该自定义属性并指定默认值,这样系统主题找不到属性时会 fallback 到默认值:
创建或修改attrs.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="textColor" format="color" default="#20282D" /> </resources>
你的自定义主题中对textColor的定义依然会覆盖默认值,同时避免系统主题加载时崩溃。
方案3:强制布局使用自定义主题加载
如果浮动视图是通过非Activity的Context(如Application Context)加载的,可能会使用系统主题。可以用ContextThemeWrapper包装Context,强制加载布局时使用你的自定义主题:
Context themedContext = new ContextThemeWrapper(context, R.style.AppTheme); View floatingView = LayoutInflater.from(themedContext).inflate(R.layout.floating_view, null);
内容的提问来源于stack exchange,提问作者Faruk Yazici
相关产品推荐
相关产品推荐

