如何更改窗口小部件中的ProgressBar颜色?

时间:2015-01-25 13:31:00

标签: android android-appwidget

有没有办法在运行时更改app小部件中驻留的ProgressBar的颜色?

这是ProgressBar进度值的更新方式:

RemoteViews views = new RemoteViews( context.getPackageName(), R.layout.widget );
views.setProgressBar( R.id.progressbar, 100, 10, false );
...
appWidgetManager.updateAppWidget( widgetID, views );

不幸的是,RemoteViews类不允许我们为ProgressBar设置颜色过滤器甚至不同的进度。

任何想法都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,需要在自定义通知布局中着色ProgressBar。 我已经使用反射API做到了:

    Method setTintMethod = null;
    try {
        setTintMethod = RemoteViews.class.getMethod("setProgressTintList", int.class, ColorStateList.class);
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
    if (setTintMethod != null) {
        try {
            setTintMethod.invoke(mYourRemoteViews, R.id.your_progress_bar_id, ColorStateList.valueOf(yourColor));
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

答案 1 :(得分:0)

在ProgressBar XML中添加以下行:

android:progressDrawable="@drawable/progressbar"

现在创建progressbar.xml drawable:

<?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>
        <corners android:radius="5dip" />
        <gradient
                android:startColor="#ff9d9e9d"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:angle="270"
        />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#80ffd300"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:angle="270"
            />
        </shape>
    </clip>
</item>
<item
    android:id="@android:id/progress"
>
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="#33FF33"
                android:endColor="#008000"
                android:angle="270" />
        </shape>
    </clip>
</item>

</layer-list>

参见参考: Android change Horizonal Progress bar color

答案 2 :(得分:0)

例如,您具有带有以下内容的progressDrawable(层列表):

  • @android:id / background-纯色
  • @android:id / progress-应该以编程方式更新

您可以使用技巧:

  1. 您可以在progressBar后面创建ImageView而不是进度层,并使用setInt(id,“ setColorFilter”,color)更新其颜色
  2. 将android:rotation =“ 180”添加到xml文件中的progressBar
  3. 应该设置“最大-进度”值,而不是设置进度值
  4. 现在将progressBar用作背景