一般来说按照文档的建议去做,出现问题的概率很低。但很多人的情况不同,每每会发生意外状况,就比如这次没有使用 AppCompat 主题引发的坑!
AppCompat 框架作为 Jetpack 集合的基石,非常重要。Android Studio 上创建的默认项目都会自动集成 AppCompat 框架,并采用其提供的 AppCompatActivity 作为 Activity Base。
App 侧给 Activity 配置的主题一般扩展自 SDK 提供的系统主题或 AppCompat 提供的主题,前者的话极有可能引发一些 AppCompat 框架的使用异常。
非 AppCompat 主题引发了异常
如果配置的是扩展自 SDK 的主题,Activity 必然无法启动,并发生如下异常:
RuntimeException: Unable to start activity xxx: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
原因很简单,AppCompat 框架的诸多后续处理紧密关联该主题配置的属性。因此在加载画面前将严格检查是否采用了 AppCompat 系主题,否则将抛出异常。
class AppCompatDelegateImpl ... {
private ViewGroup createSubDecor() {
TypedArray a = mContext.obtainStyledAttributes(R.styleable.AppCompatTheme);
if (!a.hasValue(R.styleable.AppCompatTheme_windowActionBar)) {
a.recycle();
throw new IllegalStateException(
"You need to use a Theme.AppCompat theme (or descendant) with this activity.");
}
...
return subDecor;
}
}
如何解决这个问题呢?
-
主题改为扩展自 AppCompat 系主题。 但如果自己的主题覆写的地方很多,这将耗费很长时间,而且很多自定义的属性可能还会和 AppCompat 主题产生冲突,需要逐个分析、细细调整
-
Activity 改用 SDK 版本,即
android.app.Activity。 但随着 Jetpack 框架的日渐成熟和流行,很多重要的框架非常依赖于 AppCompatActivity 的支持,比如Lifecycle框架、ViewModel框架、Preference等。这可能导致其他的框架功能发生问题,也不是很好 -
AppCompat 哪里有兼容性问题解决哪里的回避方案。 比如上面的异常其实就是检查是否配置了 AppCompat 框架提供的
windowActionBar属性而已,那么我们在自己的主题里加上该属性的引用就可以了。不好的地方就在于,很多不是异常的 UI 展示问题,如果没有发现的话,很容易被忽略。也就是说,这个方案容易改得不全,产生遗漏
前2个方案没啥好说,我们具体来分析下第3个方案具体怎么操作。
如何使用非 AppCompat 主题
在扩展自 SDK 的主题里额外配置下 windowActionBar 属性即可,true 或者 false 依需而定。
<style name
解决非AppCompat主题的AppCompat兼容问题:策略与实践

本文详细探讨了在Android开发中遇到的非AppCompat主题导致的AppCompat框架使用异常,提供了三种解决方案:主题切换、Activity改版及手动兼容AppCompat控件。通过实例演示如何配置windowActionBar属性和AppCompatCheckBox,以确保兼容性并避免遗漏问题。
最低0.47元/天 解锁文章
4254

被折叠的 条评论
为什么被折叠?



