为一个小部件设置AppWidget背景也会影响其他小部件

时间:2016-02-17 23:17:29

标签: android android-appwidget

我的小部件的布局文件从顶层开始:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/widget_margin"
    android:id="@+id/widget"
    android:background="#20000000" >

因此,起始背景是半透明的。然后在执行期间的某个时刻,我调用以下内容使背景完全透明:

remoteViews.setInt(R.id.widget, "setBackgroundColor", Color.parseColor("#00000000"));
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);

虽然这有效,但我发现的是,当添加另一个窗口小部件时,该窗口小部件的背景根据布局xml开始为完全透明而不是半透明。它就好像为一个小部件设置背景颜色已经改变了它,包括随后添加的新小部件。

现在这很奇怪,因为与上面的代码片段同时,我还在小部件中添加了一个位图(通过RemoteViews):

remoteViews.setImageViewBitmap(R.id.imageView, bmp);

...和 位图不会出现在所有后续小部件中,因此我使用的基本方法似乎是合理的。

那么为什么背景会传播到其他小部件?

编辑以在评论中添加appWidgetId的派生:

基本上来自Intent,例如在小部件的onCreate()配置Activity中:

Intent intent = getIntent();
Bundle extras = intent.getExtras();
int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

1 个答案:

答案 0 :(得分:0)

在您的AppWidgetProvider班级中,您可以覆盖onUpdate方法。最后一个参数是appWidgetIds,它是当前活动窗口小部件ID的数组。很可能你实现了为每个widgetId更改循环遍历该数组的背景颜色。为了能够为每个窗口小部件定义自定义背景,您需要实现将所需背景映射到特定widgetId的逻辑,并尊重循环内的逻辑。