Android:如何更改每个元素的Drawable资源的颜色?

问题描述 投票:0回答:1

我正在制作一个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() {
    }

}
android android-studio android-layout kotlin android-drawable
1个回答
0
投票

使用RemoteViews的setProgressBackgroundTintList方法更改蓝色,并使用setProgressTintList方法更改红色。

© www.soinside.com 2019 - 2024. All rights reserved.