Как программно изменить фоновый макет виджета в Android - PullRequest
11 голосов
/ 01 июня 2011

Возьмем, к примеру, этот макет виджета (часть всего макета моего виджета).

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/widget_background_dark_4x2"
android:orientation="horizontal"
android:id="@+id/widget_main"
>

Я хочу иметь возможность изменять фоновый рисунок, используемый в зависимости от выбора пользователя.Например, используя удаленные виды, я могу обновить цвет текстового представления, выполнив что-то вроде этого:

remoteView.setTextColor(R.id.text_view1, Color.WHITE);

Однако мне было трудно сделать то же самое для фона моего линейного макета.Я пробовал это:

remoteView.setBitmap(R.id.widget_main, "setBackgroundDrawable", ((BitmapDrawable) context.getResources().getDrawable(R.drawable.widget_background_dark_4x2)).getBitmap());

Но я получаю следующую ошибку:

06-01 22:46:36.305: WARN/AppWidgetHostView(244): android.widget.RemoteViews$ActionException: view: android.widget.LinearLayout doesn't have method: setBackgroundDrawable(android.graphics.Bitmap)

<< РЕДАКТИРОВАТЬ >> Также пробовал это:

Bitmap bitmap = ((BitmapDrawable)context.getResources().getDrawable(R.drawable.widget_background_light_4x2)).getBitmap();
remoteView.setBitmap(R.id.widget_main, "setBackgroundDrawable",bitmap );

Нок сожалению получаю следующую ошибку:

06-01 23:11:26.039: WARN/AppWidgetHostView(244): updateAppWidget couldn't find any view, using error view 06-01 23:11:26.039: WARN/AppWidgetHostView(244): android.widget.RemoteViews$ActionException: view: android.widget.LinearLayout doesn't have method: setBackgroundDrawable(android.graphics.Bitmap)

Ответы [ 2 ]

34 голосов
/ 03 февраля 2013

Вы пробовали:

remoteView.setInt(R.id.widget_main, "setBackgroundResource", R.drawable.widget_background_dark_4x2);
7 голосов
/ 06 июня 2011

Хорошо, единственное решение, которое я мог придумать для этого, - это изменить способ отображения фонового изображения в LinearLayout. Как вы можете видеть выше, я использовал тег android: background для отображения изображения. В итоге я удалил это, а затем упаковал весь макет виджета (который находился внутри линейного макета внутри относительного макета. Затем я просто удалил ImageView сначала в пределах RelativeLayout, а затем оставил линейное макет остальных виджетов сверху. Затем в моем коде я просто установил источник просмотра изображений через удаленный просмотр, и он работал как удовольствие.

Не самый элегантный / эффективный способ его кодирования, но это сработало!

...