Android API22真机启动Splash Activity崩溃问题求助
解决API22真机启动Splash崩溃(Resources$NotFoundException)
从崩溃日志可以明确看出,问题出在**@drawable/restaurant资源无法被API22设备识别为Drawable类型**,而模拟器(API版本更高)能正常解析,这通常是低版本Android对Drawable资源的兼容性问题导致的。下面是具体的排查和解决方法:
1. 先确认restaurant资源的类型和位置
首先打开res/drawable/restaurant.xml(或对应分辨率文件夹下的该文件),检查:
- 如果是矢量图(VectorDrawable):API21+原生支持矢量图,但在XML布局中直接用
android:background引用,低版本(甚至部分API21/22设备)会出现识别错误。 - 如果是自定义Drawable(shape/selector等):检查是否使用了API22以上才支持的属性(比如
android:tintMode、android:alpha的某些取值)。 - 如果是误放的非Drawable资源:比如把布局文件、color资源放在了drawable文件夹下,也会触发这个报错。
2. 针对矢量图资源的兼容方案
如果restaurant是矢量图,按以下步骤处理:
步骤1:配置gradle支持矢量图兼容
在app模块的build.gradle(Module级别)中,添加矢量图支持库配置:
android { defaultConfig { // 启用矢量图兼容库,让API7+设备支持矢量图 vectorDrawables.useSupportLibrary = true } }
同步gradle后,继续下一步。
步骤2:替换XML中的背景引用(或用代码设置)
由于低版本Android不支持在XML中直接用android:background引用矢量图,我们可以:
- 方法A:移除布局中的
android:background="@drawable/restaurant",在代码中用兼容方式设置背景:
在Splash.java的onCreate方法里,setContentView之后添加:import android.graphics.drawable.Drawable; import android.os.Build; import androidx.core.content.res.ResourcesCompat; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); // 低版本用兼容方式设置背景 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { Drawable bgDrawable = ResourcesCompat.getDrawable(getResources(), R.drawable.restaurant, null); findViewById(android.R.id.content).setBackground(bgDrawable); } // 原有的延迟跳转代码... } - 方法B:将矢量图转换为PNG图片,放在对应分辨率的
drawable-hdpi/drawable-xhdpi等文件夹中,替换原矢量图资源。这种方法不需要任何兼容配置,所有版本都能正常识别。
3. 针对自定义Drawable资源的修复
如果restaurant是shape/selector等自定义Drawable:
- 检查XML中的属性,把API22以上才支持的属性(比如
android:tintMode="src_in")移到drawable-v22文件夹下的同名文件中。 - 低版本使用不包含高版本属性的Drawable文件,放在通用的
drawable文件夹中。
4. 排查资源冲突问题
检查所有drawable-*文件夹,确保:
- 没有重名的非Drawable资源(比如把
restaurant.xml布局文件放在drawable文件夹)。 - 所有版本的Drawable资源类型一致(比如低版本文件夹里不要放color资源代替Drawable)。
按以上步骤排查后,API22真机应该就能正常启动Splash Activity了。
内容的提问来源于stack exchange,提问作者user8990420
相关产品推荐
相关产品推荐

