Android-виджет ImageButton теряет изображение при повороте экрана - PullRequest
4 голосов
/ 16 апреля 2010

У меня на домашнем экране виджет с несколькими кнопками ImageButton, которые имеют фоновые изображения по умолчанию. В процессе настройки я могу изменить изображение на любой из кнопок ImageButton. Проблема заключается в том, что при повороте экрана изображение в ImageButton исчезает и оно возвращается к изображению по умолчанию.

Я не знаю, почему это происходит или как это исправить

Ответы [ 2 ]

9 голосов
/ 16 апреля 2010

Когда экран поворачивается, весь appwidget перестраивается с использованием последнего RemoteViews объекта, который вы передали AppWidgetManager .updateAppWidget (). Таким образом, очень важно, чтобы каждый раз, когда вы вызываете updateAppWidget (), вы передавали объект RemoteViews, на котором было установлено все, что нужно виджету для полного перестроения, а не только одна или две вещи, которые вы хотите обновить в виджете. дисплей.

Итак, в вашем AppWidgetProvider классе при каждом обновлении вашего appwidget вам необходимо создать объект RemoteViews, создать все настройки представления для вашего appwidget, используя этот объект, а затем сделать один вызов AppWidgetManager. .updateAppWidget (), когда вы закончите.

Полагаю, вы делаете что-то вроде этого:

  • Получить объект RemoteViews
  • Установить новое изображение кнопки
  • Вызовите updateAppWidget ()
  • Получить объект RemoteViews
  • Установить отложенное намерение на кнопку
  • Call updateAppWidget ()

Когда вам нужно сделать что-то вроде этого:

  • Получить объект RemoteViews
  • Установить новое изображение кнопки
  • Установить отложенное намерение на кнопку
  • Вызовите updateAppWidget ()
1 голос
/ 16 апреля 2015

Mbaird ответ один.
Но есть и другое решение. Решением является использование updateAppWidget при создании / обновлении всего представления виджета и частичноUpdateAppWidget при изменении только части представления. Тогда вид не сбрасывается.

Пример частичного обновления (показать маленький значок синхронизации на всех виджетах):

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);    
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, Widget.class)); 
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

views.setViewVisibility(R.id.syncImage, View.VISIBLE);

for (int i = 0; i < appWidgetIds.length; i++) {    
    appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], views);
}
...