Автоматическое вращение экрана Отключение виджета RemoteView onClick - PullRequest
7 голосов
/ 20 июня 2010

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

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

Спасибо!

Ответы [ 3 ]

3 голосов
/ 14 января 2011

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

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


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

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

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

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

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

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

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

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

- Костя

0 голосов
/ 16 июня 2016

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

Когда вы хотите обновить свои удаленные представления, но не хотите предоставлять полное представление RemoteViews, т.е.вы просто хотите изменить существующее состояние remoteView, вы можете использовать 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);
0 голосов
/ 28 октября 2014

Следующий код позволяет решить проблему.

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