How to change the progress indicator‘s color when creating a widget using Glance in Android?
介绍
在 Android 中使用 Jetpack Glance 实现 Widget/微件 添加进度条控件时,在 Android 12 (API 级别 31) 及以上时可以修改它的颜色,但是在 Android 11(API 级别 30) 及以下的设备上无法改变进度条的颜色。
例如:使用 Jetpack Glance 创建 Widget/微件 并添加红色的进度条
@Composable
fun WidgetWithProgress() {
Box(
modifier = GlanceModifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator(color = ColorProvider(Color.Red))
}
}
在 Android 12 上的效果正常,能显示为红色:
但是在 Android 11 及以下的系统上并不显示红色:
原因 & 解决方法:
Jetpack Glance 实现 Widget 是在运行时根据我们提供的 Composable/可组合函数生成 RemoteView,但是 Android 从 Android 12 (API 级别 31) 起才支持运行时设置进度条颜色,所以在 Android 12 之前的系统中无法在可组合函数中修改进度条的颜色。
这是 Google IssueTracker 中对这个问题的回复:
Status: Won't Fix (Intended Behavior)
Unfortunately, setting the color of a progress indicator at runtime has only been possible since api 31.
For earlier API support you can override Glance.AppWidget.CircularProgressIndicator
style to set the colors of your indicators.
所以对于 Android 12 之前的系统的支持,需要通过覆盖 Jetpack Glance 的 Glance.AppWidget.CircularProgressIndicator 样式来设置进度条颜色。
如下是在 styles.xml 在覆写 Glance.AppWidget.CircularProgressIndicator 样式:
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Glance.AppWidget.CircularProgressIndicator"
parent="@android:style/Widget.DeviceDefault.ProgressBar"
tools:override="true">
<item name="android:indeterminateTint">@android:color/holo_red_light</item>
</style>
</resources>
覆写 Jetpack Glance 的样式后 CircularProgressIndicator 的颜色就改变了。