Android KitKat 4.4使用colored-time-selector库出现InflateException求助
这个问题在旧版本Android系统里挺常见的,核心原因基本是库中用到了KitKat不支持的API或者兼容性配置没跟上。下面给你几个针对性的解决方案,你可以挨个试试:
1. 调整ConstraintLayout版本适配KitKat
你提到布局用了android.support.constraint.ConstraintLayout,新版本的ConstraintLayout对KitKat支持有限。建议你把项目里的ConstraintLayout换成1.1.3版本(官方明确标注支持KitKat的稳定版),在build.gradle里修改依赖:
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
2. 开启VectorDrawable兼容支持
很多第三方库会用到VectorDrawable,但KitKat默认没法直接加载这类资源。你需要在App的build.gradle里添加兼容配置:
android { defaultConfig { vectorDrawables.useSupportLibrary = true } }
如果库的布局文件里用android:src加载Vector图标,还得改成app:srcCompat(要是能修改库源码的话),或者在自己项目里用AppCompatImageView替换对应的View。
3. 补全TimelineView的构造方法
KitKat的LayoutInflater加载自定义View时,可能会调用不带样式参数的构造方法。如果库中的TimelineView没覆盖所有构造方法,就会抛出InflateException。你可以把库的源码复制到自己项目里,补全构造方法:
public class TimelineView extends View { public TimelineView(Context context) { this(context, null); } public TimelineView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TimelineView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // 保留原有的初始化逻辑 } }
4. 统一Support库版本避免冲突
如果库依赖的Support库版本比你项目里的高,或者用到了KitKat不支持的特性,也会导致崩溃。你可以在build.gradle里强制统一Support库版本:
configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> def requested = details.requested if (requested.group == 'com.android.support') { if (!requested.name.startsWith("multidex")) { details.useVersion '28.0.0' // 选一个KitKat兼容的版本,比如28.0.0 } } } }
5. 自定义时间选择逻辑(终极方案)
要是以上方法都没解决问题,你可以参考这个库的逻辑,自己实现一个简化版的时间选择器,只保留07:00-19:00的选择功能——这样完全掌控代码兼容性,避开第三方库的坑。
内容的提问来源于stack exchange,提问作者Ash faa

