Динамическое изменение фона AppWidget с помощью 9 патчей - PullRequest
4 голосов
/ 22 февраля 2012

В классе RemoteViews нет метода setBackground(), поэтому я использовал следующий обходной путь:

  1. Создал FrameLayout для моего виджета приложения с ImageView какфоновое представление.
  2. Изменено изображение ImageView с использованием метода setImageViewResource().

К сожалению, когда дело доходит до рисования с 9 патчами, этот метод не работает.Также, когда атрибут ImageView android:src указывает на 9-патч - он тоже не работает.Есть ли способ изменить фоновое изображение AppWidget программно, используя 9-патч?Заранее спасибо.

EDIT Установка 9-патча в качестве исходного фона в XML:

<ImageView
    android:id="@+id/small_widget_layout_bg"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_lime" />

Когда я использую android:src="@drawable/background_lime", он не растягиваетизображение правильно, этот код работает нормально.И код для изменения фона из AppWidgetProvider onUpdate метода:

views.setImageViewResource(R.id.small_widget_layout_bg,
                    R.drawable.backgroung_lime);

Это не растягивает изображение как 9-патч.

Ответы [ 2 ]

5 голосов
/ 27 февраля 2012

Этот ответ был диагностирован в приведенных выше комментариях ...

RemoteView не разрешает доступ к View.setBackground(), поэтому ваш обходной путь использования свойства android:src для ImageView подходит, если для свойства the android:scaleType установлено значение fitXY,

ImageView не растянет изображение переднего плана, если вы не скажете ему.

4 голосов
/ 27 февраля 2012

Пожалуйста, игнорируйте, если вы находите это тривиальным или нерелевантным, но вы не можете попробовать (если вы имеете дело с widgets ):

  • Объявление различных макетов (xml) для вашего widget.
  • Измените источник remoteView' s (layout.id) вместо попыток внести изменения в выбранный макет.

AFAIK , это наиболее распространенный подход к решению таких проблем. Это не идеально для двух простых вещей, которые я мог бы отметить сам:

  • Что вы будете делать, если у вас есть n различных "состояний" / "представлений" в вашем виджете?

Но если ваши файлы с 9 патчами также являются статическими ресурсами, n является болезненным, но теоретически управляемым.

  • Отслеживать изменения в этих параллельных файлах утомительно.

Я бы тоже хотел найти легкий способ для этого ...

Этот подход не может быть вариантом для вас также, потому что это в основном трудный путь. Но, тем не менее, это вариант.


Предложение № 2

Вы пытались использовать метод?

public void setInt (int viewId, String methodName, int value)

remoteView.setInt(R.id.viewid, "setBackgroundResource", R.drawable.backgroung_lime);

Из другого вопроса: Изменение удаленного просмотра фона ImageView

...