Виджет главного экрана Android: метод удаленного просмотра setRemoteAdapter(...) не работает в API 11+

Так что вызовы метода onUpdate

remoteViews.setRemoteAdapter(id, R.id.listview, intent)

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

В заголовке виджета есть кнопка, которая может изменить набор данных, отображаемый в виде списка (например, входящие, исходящие, помеченные и т. Д. Для гипотетического виджета электронной почты). Когда я нажимаю эту кнопку, пользователь переходит в действие, которое позволяет ему выбрать, какой набор данных отображать. Когда выбор сделан, запускается следующий код:

Intent intent = new Intent(this, WidgetReceiver.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
intent.putExtra("notify", true);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {R.xml.widget_provider});
sendBroadcast(intent);

Это успешно вызывает метод onUpdate в классе AppWidgetProvider виджета. Однако, если бы мне пришлось переключаться между различными типами наборов данных, после 2-3 изменений предпочтений, setRemoteAdapter метод просто перестает функционировать. Я подробно зарегистрировал процесс и метод, который должен вызывать службу, которая, в свою очередь, загружает RemoteViewsService.RemoteViewsFactory Класс для заполнения виджета и его адаптера, не делает ничего из этого. Первые пару раз вы меняете предпочтения, все работает как положено. Но потом он уходит.

Кто-нибудь знает, что здесь происходит?

3 ответа

Решение

Странно, но нашел решение. Android, кажется, кеширует намерения, которые вы используете в своем методе onUpdate. Если вы повторно отправите то, что кажется тем же самым намерением, оно не будет работать так, как вы ожидаете.

Решение: иметь статическое итеративное целое число, которое вы включаете в качестве параметра в дополнительные функции намерений. Это решило проблему для меня.

Intent intent = new Intent(context, WidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, currentWidgetId);
intent.putExtra("random", randomNumber);
randomNumber++;
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));

Ох, Android...

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

Предложенный метод, к сожалению, не работает для меня. То, что сработало, зовет appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.list_view);

У меня есть статический метод в моем AppWidgetProvider класс, который я вызываю всякий раз, когда я хочу обновить данные виджета. Я вызвал это notifyAppWidgetViewDataChanged внутри этого метода, и все заработало. Теперь виджет обновляет данные списка должным образом.

Другие вопросы по тегам