Автоматическое вращение экрана Отключение виджета RemoteView onClick event

У меня немного странная ошибка с виджетами, которые я закодировал – после того, как экран поворачивает виджет, перестает отвечать на события onClick. Код точно такой же, как в Документах для разработчиков Android для виджетов приложений. Я заметил, что другие виджеты с рынка не имеют этой проблемы – возможно ли известное обходное решение? Я попытался постукивать по всему месту после вращения, поэтому я не думаю, что его onClickPendingIntent не будет изменен после поворота; Он, кажется, не присутствует вообще.

Я не могу найти триггер onRotation () для AppWidgetProvider, чтобы повторить код прослушивания в случае поворота, поэтому я совершенно не уверен, как продолжить …

Благодаря!

Я получил следующий ответ от сообщения, которое я сделал в Google Groups, который решил мою проблему. Я не могу сказать, разрешит ли он проблему оригинального плаката, но я бы пошл его, если кто-то столкнется с этой проблемой. Ссылка на сообщение в Google Groups:

http://groups.google.com/group/android-developers/browse_thread/thread/ca8c2958b6dc086c#


При изменении конфигурации нет onUpdate. Домашний экран воссоздает ваш виджет, затем берет самые последние RemoteViews и применяет его к виджету.

Я подумал, что это воссоздание виджета при ротации. Проблема в том, что я, кажется, не получаю никаких сообщений об этом, и не могу (что я вижу) восстановить соединение. Как я могу определить, что произошло поворот и настроено новое соединение onClick?

Как я уже сказал, вы не можете (определить или отреагировать на изменение ориентации).

Что вы делаете, убедитесь, что каждый раз, когда ваш код подталкивает объект RemoteViews в домашнее приложение для вашего виджета, он является полным во всех отношениях:

  • Идентификатор ресурса изображения;
  • Имеет текстовые укусы;
  • Имеет ожидающие намерения.

Не делайте «инкрементные» обновления виджета, как вы делали бы с обычной деятельностью – сначала не задавайте намерения, затем изображения, а затем текст, отражающий текущую информацию.

Домашнее приложение работает как отдельный процесс, и его состояние может выйти из-под контроля с вашим приемником виджетов. Когда это произойдет, единственное, что у него есть для воссоздания виджета – это ваш последний объект RemoteViews. Если он будет полным и будет иметь все части, все будет работать нормально. Если у него только самый последний текст или изменение изображения, более ранние обновления, которые имели намерения, будут потеряны.

http://kmansoft.wordpress.com/2010/05/23/widgets-and-orientation-chan

– Костя

Следующий код выглядит как возможность решить проблему.

@Override public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); onUpdate(context, appWidgetManager, new int[] {appWidgetId}); } 

Во-первых, убедитесь, что ваши RemoteViews являются ПОЛНЫМ представлением состояния виджета, если вы вызываете AppWidgetManager.updateAppWidget() . Настройте все ожидающие намерения, просмотрите данные и т. Д. Это состояние будет повторно использоваться, когда пусковая установка хочет восстановить виджет из состояния, например. Когда изменяется вращение.

Если вы хотите обновить свои удаленные представления, но не хотите предоставлять полное представление RemoteViews, то есть. Вы просто хотите изменить существующее состояние удаленного просмотра, вы можете использовать AppWidgetManager.partiallyUpdateAppWidget() .

Это обновление отличается от updateAppWidget (int, RemoteViews) тем, что передаваемый объект RemoteViews понимается как неполное представление виджета и, следовательно, не кэшируется AppWidgetService. Обратите внимание, что поскольку эти обновления не кэшируются, любое состояние, которое они модифицируют, не восстанавливается с помощью restoreInstanceState, не будет сохраняться в случае восстановления виджетов с использованием кэшированной версии в AppWidgetService. Используйте с RemoteViews.showNext (int), RemoteViews.showPrevious (int), RemoteViews.setScrollPosition (int, int) и аналогичные команды.

Например, при продвижении ViewPager для виджета вне onUpdate:

 final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget_4x2); remoteViews.showNext(R.id.appWidget_viewFlipper); appWidgetManager.partiallyUpdateAppWidget(widgetId, remoteViews);