106 votes

Mettre à jour le widget de manière programmée à partir de l'activité/service/receiver

Je sais que c'est possible, mais je ne trouve pas de 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 ?

210voto

phaethon Points 759

Si vous utilisez un AppWidgetProvider, vous pouvez le mettre à jour de cette manière:

Intent intent = new Intent(this, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
// Utilisez un tableau et EXTRA_APPWIDGET_IDS à la place de AppWidgetManager.EXTRA_APPWIDGET_ID,
// car il semble que onUpdate() est seulement déclenché sur cela:
 int[] ids = AppWidgetManager.getInstance(getApplication())
    .getAppWidgetI‌​ds(new ComponentName(getApplication(), MyAppWidgetProvider.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
sendBroadcast(intent);

30 votes

Où définissez-vous widgetId ?

1 votes

Est-ce que l'AppWidgetProvider exécute ensuite la méthode onUpdate()?

38 votes

@KrisB à partir de la réponse ci-dessous, obtenez le tableau en faisant ceci: int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));

80voto

Stuck Points 2206

Cela m'a aidé lorsque j'ai cherché sur comment mettre à jour un widget à partir d'un service ou d'une action (mais cela peut être possible depuis n'importe quel contexte) :

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, "monTexte" + System.currentTimeMillis());
appWidgetManager.updateAppWidget(thisWidget, remoteViews);

0 votes

Je sais que j'arrive ici comme 6 mois en retard. Mais je suis d'accord avec Andrew. J'ai essayé la méthode originale dans ce fil de discussion. Et quelque chose concernant la façon dont les identifiants sont récupérés a provoqué son échec. Cette méthode (de mettre à jour directement les champs manuellement) fonctionne mieux. Du moins pour mes besoins.

0 votes

Choses impressionnantes. Je ne sais pas comment vous avez réussi à obtenir cela, mais cela fonctionne bien et parfaitement pour toutes les instances de mon Widget. :)

0 votes

Cela a également fonctionné pour moi. Je pensais que nous aurions besoin de faire une diffusion et un onReceive, mais mes besoins correspondent parfaitement à cela

33voto

Voidcode Points 446

Donc pour mettre à jour un widget depuis 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);

Fonctionne pour moi :)

0 votes

Il appelle la méthode de remplacement onRecieve. Mais je veux savoir comment appeler la méthode onUpdate.

13voto

user956415 Points 3301
int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));

pour (int id : widgetIDs)
    AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view);
}

1 votes

Nécessite un niveau min-api : 11.

0 votes

Génial. Vous n'avez même pas besoin de boucler, il y a une version de notifyAppWidgetViewDataChanged() qui prend un tableau.

5voto

CommonsWare Points 402670

Il suffit de récupérer une instance de AppWidgetManager et de la mettre à jour directement. Ou, si vous utilisez un IntentService pour effectuer les mises à jour, appelez startService() sur le IntentService. Le AppWidgetProvider est une façon de mettre à jour le widget de l'application, mais ce n'est pas la seule façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X