使用support:appcompat-v7继承AppCompatActivity时应用崩溃问题
崩溃日志明确抛出java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity,更换appcompat版本无法解决问题,核心诱因有三点:
- SDK与依赖版本严重不匹配:配置中
compileSdkVersion 25、buildToolsVersion 21.1.0、targetSdkVersion 28,同时混用25.0.0、28.0.0版本的appcompat库。Android Support库的大版本号必须和compileSdkVersion严格对应,跨版本混用会导致AppCompat相关主题资源无法被正确打包进APK - 主题资源引用失效:虽然Manifest中写了
@style/Theme.AppCompat.Light,但版本不匹配导致编译时无法引用appcompat库内的主题资源,运行时实际加载的是系统框架层的非AppCompat主题,直接触发AppCompatActivity的主题校验逻辑崩溃 - 包名配置不一致:崩溃日志中显示Activity路径为
com.mapps.whiteboard.MainActivity,但代码和Manifest中声明的包名为com.myapps.boardgraphic,包名错位也会导致资源引用异常
1. 统一SDK和依赖版本
修改build.gradle文件,保证compileSdkVersion、buildToolsVersion、appcompat依赖版本、targetSdkVersion完全匹配,Support库最高适配到28版本即可:
apply plugin: 'com.android.application' android { compileSdkVersion 28 buildToolsVersion "28.0.3" // 使用和compileSdk匹配的构建工具版本 defaultConfig { applicationId "com.myapps.boardgraphic" minSdkVersion 25 targetSdkVersion 28 // 和compileSdk版本对齐 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false useProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) // Support库版本和compileSdkVersion完全对齐,28版本对应28.0.0 compile "com.android.support:appcompat-v7:28.0.0" }
注意:Support库的大版本号必须和compileSdkVersion完全一致,比如compileSdk为25就只能用25.x.x的appcompat,跨版本用28.0.0必然出现资源找不到的问题
2. 校验主题与包名配置
首先确认res/values/styles.xml里的主题继承自AppCompat主题,不要错误继承系统框架的原生主题:
<!-- res/values/styles.xml --> <resources> <style name="AppTheme" parent="Theme.AppCompat.Light"> <!-- 可按需添加自定义主题属性 --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources>
然后修改AndroidManifest.xml里的application主题引用,指向自定义的AppCompat主题,同时全局检查包名,保证代码、Manifest、构建配置中的包名完全一致:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.myapps.boardgraphic" > <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:resizeableActivity = "true"> <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
3. 清理缓存重新编译
改完配置后执行以下操作避免旧构建缓存影响:
- 点击Android Studio菜单栏的
Build->Clean Project - 再点击
Build->Rebuild Project - 卸载设备上之前安装的旧版本APK,重新安装新编译的包即可
如果改完仍崩溃,检查main.xml布局文件内的控件引用:所有Support库对应的控件(比如android.support.v7.widget.Toolbar、android.support.v7.widget.AppCompatButton)的包名要和当前使用的appcompat版本匹配,不要出现25版本包名和28版本包名混用的情况。
内容的提问来源于stack exchange,提问作者Hanzalah

