Android ProgressBar加载时为何忽略部分XML属性?
问题原因及解决方案
错误点分析
- 你使用的
?android:attr/progressBarStyle是系统默认的不确定圆形进度条样式,该样式本身没有实现确定模式的绘制逻辑,因此即使设置android:indeterminate="false"也不会生效,进度条依然会保持不确定的动画状态。 - 显示绿色是因为不确定状态下,
progressTint不会生效,系统会使用indeterminateTint的默认绿色值。
解决方案
方案1:自定义圆形确定进度条(兼容所有Android版本)
- 在
res/drawable目录下创建circle_progress.xml文件,定义圆形进度条的形状:
<rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="270" android:toDegrees="270"> <shape android:innerRadiusRatio="2.5" android:shape="ring" android:thicknessRatio="10" android:useLevel="true"> <solid android:color="#ffff0000" /> </shape> </rotate>
- 修改布局中的ProgressBar,更换样式并指定自定义drawable,同时设置初始进度:
<ProgressBar android:id="@+id/progressBar2" style="?android:attr/progressBarStyleHorizontal" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:indeterminate="false" android:progress="50" <!-- 必须设置初始进度,否则无显示 --> android:progressDrawable="@drawable/circle_progress" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
方案2:使用Material组件的原生圆形确定进度条(推荐,需依赖Material库)
如果你的项目已集成Material Components库,可以直接使用CircularProgressIndicator,它原生支持确定模式:
<com.google.android.material.progressindicator.CircularProgressIndicator android:id="@+id/progressBar2" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:indeterminate="false" android:progress="50" app:indicatorColor="#ffff0000" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
注意事项
确定型进度条必须通过android:progress属性(或代码中调用setProgress()方法)设置具体进度值,否则不会显示任何进度内容。
内容的提问来源于stack exchange,提问作者Ian Bailey-Mortimer
相关产品推荐
相关产品推荐

