Обновление Android-виджета от активности
У меня есть виджет, его настройка так, что, когда я нажимаю на него, он открывает некоторые настройки в активности.
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
Это настраивает некоторые параметры для приложения. Я хочу добиться того, чтобы виджет обновил свое представление, чтобы отразить измененные параметры, когда запуск Activity я закрывается. Использование интервала обновления или любого другого типа опроса не подходит для этого.
Я видел пару мест здесь и в андроидах, которые использовали этот код:
appWidgetManager.updateAppWidget(mAppWidgetId, views);
Но я не знаю, как получить значение mAppWidgetId. Я попробовал следующий пример для активности конфигурации виджета здесь http://developer.android.com/guide/topics/appwidgets/index.html, но в следующем коде
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
extras всегда имеет значение null, поэтому я никогда не получаю AppWidgetID.
Хорошо, теперь я просто бессвязно. Как вы думаете, что я могу сделать?
Ответы
Ответ 1
Наконец-то я нашел ответ, который я искал, это было в перегрузке функции updateAppWidget.
appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views);
Позвольте мне получить доступ к виджету, не зная его. Тогда мой последний код в моей деятельности:
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(this, Settings.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views);
finish();
Мне нужно сделать все то же самое, что мне нужно было сделать в методе onUpdate Widget, но теперь каждый раз, когда я выхожу из своей активности, виджет отображает правильное состояние.
Ответ 2
Другой способ сделать это - передать идентификатор виджета в ожидающем намерения, которое вы используете для запуска активности:
Intent clickIntent=new Intent(context, MyConfigActivity.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
// you have the widgetId here, since it your onUpdate
PendingIntent pendingIntent=PendingIntent
.getActivity(context, 0,
clickIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
Кроме того, чтобы избежать дублирования кода из onUpdate(), вы можете передать намерение обратно AppWidgetProvider:
Intent intent = new Intent(this,MyAppWidgetProvider.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
// Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID,
// since it seems the onUpdate() is only fired on that:
int[] ids = {widgetId};
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
sendBroadcast(intent);
Ответ 3
Я знаю, что на это был дан ответ и принят раньше. Однако, пока я искал одно и то же, я наткнулся на просто простой способ обновления виджета.
Для будущих читателей:
Лучшая часть, это работает для всех экземпляров виджета и из любого контекста (Activity, Service и т.д.)
Вот код,
Context context = this;
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1);
ComponentName thisWidget = new ComponentName(context, MyWidget.class);
remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis());
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
Courtesy - Stuck:)
Ответ 4
Вместо того, чтобы выполнять вызов из вашей активности, я предпочитаю отправлять широкоформатный запрос на получение виджета для обновления. Метод onUpdate будет запущен, и все макеты виджетов будут переданы.
Вот мой код ниже:
1- отправка широковещательной передачи из активности:
Intent intent = new Intent(ctxt, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
int[] ids = {R.layout.appwidget};
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
ctxt.sendBroadcast(intent);
и теперь, 2- реализуем метод onUpdate:
Intent i = new Intent(ctxt, Settings.class);
PendingIntent pi = PendingIntent.getActivity(ctxt, 0, i, 0);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(ctxt.getPackageName(), widgetId);
remoteViews.setTextViewText(R.id.statusMsg, msg);
remoteViews.setOnClickPendingIntent(R.id.rootView, pi);
AppWidgetManager mngr = AppWidgetManager.getInstance(ctxt);
ComponentName wdgt = new ComponentName(ctxt, MyAppWidgetProvider.class);
mngr.updateAppWidget(wdgt, remoteViews);
}
Вот и все! Я хочу, чтобы это помогло вам:)