Java 在应用程序小部件中设置backgroundTint

Java 在应用程序小部件中设置backgroundTint,java,android,background-color,android-appwidget,Java,Android,Background Color,Android Appwidget,我想更改我的应用程序小部件中按钮的背景色。 因为我想保持正常安卓按钮的形状,所以我考虑了背景色。我必须在我的小部件类的onUpdate方法中以编程方式设置颜色 我试过: views.setInt(buttonId,“setBackgroundColor”,Color.parseColor(“#ffffff”); ->也会更改按钮形状 views.setInt(buttonId,“setBackgroundTint”,Color.parseColor(“#ffffff”); views.setI

我想更改我的应用程序小部件中按钮的背景色。 因为我想保持正常安卓按钮的形状,所以我考虑了背景色。我必须在我的小部件类的onUpdate方法中以编程方式设置颜色

我试过:

views.setInt(buttonId,“setBackgroundColor”,Color.parseColor(“#ffffff”);
->也会更改按钮形状

views.setInt(buttonId,“setBackgroundTint”,Color.parseColor(“#ffffff”);
views.setInt(buttonId,“setTint”,Color.parseColor(“#ffffff”);
views.setInt(buttonId,“setColorFilter”,Color.parseColor(“#ffffff”);
->无法显示小部件(logcat中没有错误代码)

views.setInt(buttonId,“setBackgroundTintList”,colorStateList);
->需要一个ColorStateList不是int

您知道解决方案还是简单的替代方案

编辑: 还有一些代码:

AppWidget.java:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    for (int appWidgetId : appWidgetIds) {
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.app_widget);

            views.setCharSequence(buttonId, "setText", "TEXT");
            //views.setInt(buttonId, "setColorFilter", Color.parseColor("#ffffff"));

        }
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}
app_widget.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/llWidget"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false">

    <Button
        android:id="@+id/button"

        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight=".25"
        android:backgroundTint="@color/Color"
        android:text="string" />

</LinearLayout>

我最后做了类似@commonware的事情。我为每种颜色创建了一个可绘制的。根据状态(按下/未按下/…)设置.png图像。我拍摄了标准android按钮的图像,并手动更改了它们的颜色。它们位于…\Android\Sdk\platforms\Android-28\data\res文件夹中的某个位置

最后,我使用以下代码将drawable设置为背景:

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.app_widget);
views.setInt(R.id.button, "setBackgroundResource", R.drawable.btn_color);

someView.setBackgroundTint(…)
有什么问题?这是不可能的,因为AppWidgetProvider无法直接访问该按钮。你是对的,我已经很长时间没有使用它了(我不认为人们仍然使用它):)无论如何,你可能也想发布你的主题/风格,因为afaicr,整个过程都是从你的主题中选取值。我没有改变主题,它仍然是默认的。我认为在运行时更改小部件的主题也是不可能的。也许我可以切换整个布局xml。但这不是一个非常“好”的方法。创建一个定制的后台可绘制资源(例如,在一个
状态列表可绘制
中为不同的状态创建一些
形状的可绘制资源)。然后,在布局资源中引用该背景。