Android-виджет ImageButton теряет изображение при повороте экрана

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

Ответ mbaird - тот.

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

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

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);
}