web-dev-qa-db-fra.com

Mettre à jour par programme le widget d'activité/service/destinataire

Je sais que c'est possible, mais je ne peux pas trouver un moyen de déclencher une mise à jour de mon widget à partir de l'activité principale. N'y a-t-il pas une intention générale que je puisse diffuser?

84
Nuvious

Si vous utilisez en utilisant une AppWidgetProvider, vous pouvez le mettre à jour de cette façon: 

Intent intent = new Intent(this, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.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 = AppWidgetManager.getInstance(getApplication())
    .getAppWidgetI‌​ds(new ComponentName(getApplication(), MyAppWidgetProvider.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
sendBroadcast(intent);
165
phaethon

Cela a aidé lorsque j'ai cherché sur comment mettre à jour un widget à partir d'un service/ou d'une action (mais peut être possible à partir de tous les contextes):

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);
65
Stuck

Donc, pour mettre à jour un widget à partir d'une activité, vous pouvez le faire comme ceci:

Intent intent = new Intent(this, DppWidget.class);
intent.setAction("Android.appwidget.action.APPWIDGET_UPDATE");
int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), DppWidget.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
sendBroadcast(intent);

Travaille pour moi :) 

27
Voidcode

Essaye ça:

int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MyWidget.class));
        MyWidget myWidget = new MyWidget();
        myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids);
21
int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));

for (int id : widgetIDs)
    AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view);
}
11
Jakob Eriksson

Si vous travaillez avec un widget utilisant une collection telle que ListView, GridView ou StackView, pour mettre à jour les éléments du widget, procédez comme suit:

Context context = getApplicationContext();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, StackWidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.stack_view);

Avec cette méthode notifyAppWidgetViewDataChanged (), vous pouvez forcer les éléments de widget à extraire les nouvelles données en temps réel.

9
thanhtd

Procurez-vous simplement une instance AppWidgetManager et mettez-la à jour directement. Ou, si vous utilisez une IntentService pour effectuer les mises à jour, appelez startService() sur la IntentService. AppWidgetProvider est un moyen de mettre à jour le widget d'application, mais ce n'est pas le seul moyen.

5
CommonsWare