Android Studio项目ProgressBar显示Android5旧样式问题求解
问题现象
在Android项目中添加ProgressBar控件时,控件显示为Android 5版本时期的老旧样式,即使打包适配高版本Android系统,样式仍不更新,同时控件动画存在明显卡顿,无法显示默认的Material Design风格ProgressBar。

问题相关布局代码如下:
<ProgressBar android:id="@+id/progressBar3" android:layout_width="match_parent" android:indeterminate="true" android:layout_height="wrap_content" /> <ProgressBar android:id="@+id/progressBar5" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" />
对应模块build.gradle的defaultConfig配置:
defaultConfig { minSdkVersion 21 targetSdkVersion 30 versionCode 1 versionName "0.1" }
问题原因
核心原因是项目未使用Material Components系列主题,要么继承了旧版AppCompat主题,要么直接使用了系统原生主题,控件会直接调用当前系统版本的原生实现,因此回退到老旧样式,旧版原生控件的动画实现本身存在性能问题,会出现卡顿。
修复方案
- 引入Material依赖:打开模块级build.gradle文件,在dependencies节点添加Material组件库依赖,版本可根据项目现有androidx依赖版本匹配选择,不需要强制使用最新版:
dependencies { implementation 'com.google.android.material:material:1.9.0' }
- 配置全局主题:打开
res/values/styles.xml(若配置了夜间模式,需同步修改res/values-night/styles.xml),将应用主题的parent修改为Material Components主题,原有自定义的主题属性(颜色、状态栏配置等)可直接保留,无需修改:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <!-- 原有自定义主题属性保留在这 --> </style>
如果暂时不想全量替换全局主题,也可以直接给单个ProgressBar控件指定Material样式,不需要修改全局主题即可生效:圆形进度条添加
style="@style/Widget.MaterialComponents.ProgressBar",水平进度条添加style="@style/Widget.MaterialComponents.ProgressBar.Horizontal"。
- 修正布局中的样式引用:将水平ProgressBar的样式从平台原生属性
?android:attr/progressBarStyleHorizontal修改为Material库提供的属性?attr/progressBarStyleHorizontal,避免引用系统原生的旧样式。 - 同步Gradle配置,执行Clean Project清除构建缓存后重新编译运行,ProgressBar即可显示为正常的Material Design风格,动画卡顿问题也会同步解决。
内容的提问来源于stack exchange,提问作者MMA
相关产品推荐
相关产品推荐

