我正在制作一个Android应用小部件,它是具有n行的ListView。在每一行中,我都有一个自定义的圆形进度指示器,该指示器具有两种颜色:一个用于背景,一个用于前景。每行的进度指示器颜色不同,但是基于相同的Drawable资源。
我的问题是,在设置/更新窗口小部件时,如何更改每一行中的进度指示器颜色?另一个挑战是,因为我使用findViewById
构造了窗口小部件,所以我无权访问RemoteViewsFactory
。
@ drawable / circle_progress_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape
android:innerRadiusRatio="1000"
android:shape="ring"
android:thicknessRatio="10"
android:useLevel="false">
<solid android:color="#0000ff" /> <!-- I want this to be set programatically per widget row -->
</shape>
</item>
<item android:id="@android:id/progress">
<rotate
android:fromDegrees="270"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="270">
<shape
android:innerRadiusRatio="1000"
android:shape="ring"
android:thicknessRatio="10"
android:useLevel="true">
<solid android:color="#ff0000" /> <!-- this too -->
</shape>
</rotate>
</item>
</layer-list>
@ layout / widget_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@drawable/shape"
android:gravity="center_vertical">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:scaleX="2"
android:scaleY="2"
android:layout_width="100dp"
android:layout_height="60dp"
android:layout_weight="0"
android:indeterminate="false"
android:max="100"
android:progress="25"
android:progressDrawable="@drawable/circle_progress_bar" />
</LinearLayout>
EventWidgetService.kt
class EventWidgetService : RemoteViewsService() {
override fun onGetViewFactory(intent: Intent): RemoteViewsFactory =
EventRemoteViewsFactory(this.applicationContext, intent)
}
class EventRemoteViewsFactory(private val context: Context, intent: Intent) : RemoteViewsService.RemoteViewsFactory {
private val prefsName = "FlutterSharedPreferences"
override fun onCreate() {
MiniModel.initialize(context.getSharedPreferences(prefsName, Context.MODE_PRIVATE))
}
override fun getLoadingView(): RemoteViews = RemoteViews(context.packageName, R.id.emptyView)
override fun getItemId(position: Int): Long = position.toLong()
override fun onDataSetChanged() {
}
override fun hasStableIds(): Boolean = true
@ExperimentalTime
override fun getViewAt(position: Int): RemoteViews {
return RemoteViews(context.packageName, R.layout.widget_item).apply {
val event = MiniModel.events[position]
setProgressBar(
R.id.progressBar,
(event.end.epochSecond - event.start.epochSecond).toInt(),
event.secondsRemaining.toInt(unit = TimeUnit.SECONDS),
false
)
setTextViewText(R.id.item_text, event.title)
setTextViewText(R.id.details_text, if (event.isOver) "Event Complete" else "in " + event.secondsRemaining.asPrettyString)
}
}
override fun getCount(): Int = MiniModel.events.count()
override fun getViewTypeCount(): Int = 1
override fun onDestroy() {
}
}
使用RemoteViews的setProgressBackgroundTintList
方法更改蓝色,并使用setProgressTintList
方法更改红色。