ウィジェット上のボタンの画像や背景を変更する

ウィジェット上のボタン(他のオブジェクトも同様)の画像や背景を変更する方法です。
あえて記載しているのでお気づきかもしれませんが、ウィジェット上のボタンとアプリ画面上のボタンではやり方が少し違います。


アプリ画面上のボタンではボタンのオブジェクトを取得してsetImageResource()するだけでした。
こんな感じですかね。

((ImageButton)view.findViewById(R.id.btn)).setImageResource(R.drawable.img1);

では本題のウィジェット上のボタンの場合ですが、基本的にウィジェット上のオブジェクトはRemoteViewsを経由して操作を行います。

まずは、RemoteViewsを取得します。

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
// R.layout.widgetはウィジェット全体のレイアウト定義です。

そして次に、RemoteViewsに用意されているsetImageViewResource()を使用します。

views.setImageViewResource(R.id.btn, R.drawable.img1);

そして最後に、AppWidgetManagerのupdateAppWidgetにRemoteViewsを渡してあげます。
これをやらないとウィジェットの場合は更新されないので、注意が必要です。

appWidgetManager.updateAppWidget(appWidgetId, views);

onUpdateなどでは引数にAppWidgetManagerが渡されてくるのでこれだけでOKですが、
AppWidgetManagerが存在しないonReceiveなどでは、Contextから取得します。

AppWidgetManager manager = AppWidgetManager.getInstance(context);
ComponentName myWidget = new ComponentName(context, VolumePanelWidget.class);
int[] appWidgetId = manager.getAppWidgetIds(myWidget);
manager.updateAppWidget(appWidgetId, views);

ボタン画像の変更は以上です。


お次は背景の変更ですが、この流れでRemoteViewsのsetBackgroundResource()を使うだけなんじゃ?と思いきや
残念ながらRemoteViewsにsetBackgroundResource()は存在しないのです。
代わりに汎用的に用意されているsetInt()を使用します。

 views.setInt(R.id.btn, "setBackgroundResource", R.drawable.bg1);

RemoteViewsに用意されていない場合は、汎用的なsetInt()やsetBoolean()を使用する感じですね。
型毎に用意されているので、引数の型によって使い分けます。


分かってしまえば簡単ですね。