AppWidgetの背景画像を変更する

AndroidのAppWidget開発中のメモ。
AppWidgetの背景画像を変更しようとすると「ウィジェットを表示できません」と表示されてしまう。

エラー

こんな感じでAppWidgetのレイアウトを定義(途中省略)。

<LinearLayout
  android:id="@+id/appwidget_layout"
  android:background="@drawable/widgetbg">
    <TextView
      android:id="@+id/appwidget_text"
      android:text="sample" />
</LinearLayout>

更新処理でLinearLayoutのbackgroundを更新する。
AppWidget上のウィジェットを更新するにはRemoteViewsを使う。

RemoteViews views = new RemoteViews(context, R.layout.widgetlayout);
views.setInt(R.id.appwidget_layout, "setBackgroundResource", R.drawable.widgetbg_red);

こいつを実行してみたところ、AppWidgetの画面には「ウィジェットを表示できません」と表示されてしまう。

調べてみた

とりあえず、"AppWidget"、"RemoteViews"、"setBackgroundResource"といったキーワードで調べてみると、海外のメーリングリストがヒット。
Google グループ
Google グループ
どうも自分のケースと同じく、RemoteViewsを使ってsetBackgroundResourceを実行してもbackgroundが更新されないらしい。
結局解決策が見つからなかったので別の方法でチャレンジ。

FrameLayoutを使う

FrameLayoutを使い、背面にImageView、前面にLinearLayoutを配置する。

<FrameLayout>
  <ImageView
    android:id="@+id/appwidget_image" 
    android:src="@drawable/widgetbg" />
  <LinearLayout
    android:id="@+id/appwidget_layout"
    android:background="@drawable/widgetbg">
      <TextView
        android:id="@+id/appwidget_text"
        android:text="sample" />
  </LinearLayout>
</FrameLayout>

更新処理ではImageViewのsrcを更新する。

RemoteViews views = new RemoteViews(context, R.layout.widgetlayout);
views.setInt(R.id.appwidget_image, "setImageResource", R.drawable.widgetbg_red);

これだと問題なくAppWidgetの背景画像を更新できた。