6 votes

Envoi d'une diffusion de mise à jour à un widget d'application

J'ai un widget d'application avec une activité de configuration, et je veux déclencher une mise à jour du widget lorsqu'un bouton OK de l'activité est cliqué. J'ai écrit ce code :

            Intent initialUpdateIntent=new Intent(AppWidgetManager.
                    ACTION_APPWIDGET_UPDATE);
            initialUpdateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                    widgetID);
            sendBroadcast(initialUpdateIntent);

Mais pour une raison quelconque, la fonction onUpdate n'est pas appelée ! Quelqu'un sait-il quel est le problème ? Merci.

20voto

forcewill Points 538

Essayez ce qui suit :

public static void updateWidgets(Context context) {
    Intent intent = new Intent(context.getApplicationContext(), DayActivitiesAppWidget.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:
    AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
    int[] ids = widgetManager.getAppWidgetIds(new ComponentName(context, DayActivitiesAppWidget.class));

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        widgetManager.notifyAppWidgetViewDataChanged(ids, android.R.id.list);
    }

    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
    context.sendBroadcast(intent);
}

Remplacer DayActivitiesAppWidget avec votre AppWidgetProvider De cette façon, vous mettez à jour toutes vos instances de widgets, et vous pouvez ensuite trouver le problème de mise à jour d'une seule instance de widget.

1voto

NguyenDat Points 2032

Essayez-vous d'attraper votre message broastcast dans onReceive :

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    String strAction = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(strAction)) {
        /* Do update */
    }
}

Sinon, il est préférable de définir votre propre message plutôt que d'utiliser ACTION_APPWIDGET_UPDATE pour indiquer clairement la logique de la mise à jour de la vue du widget, quelque chose comme ça, en 1.déclarant le nom de l'intention dans le fichier Manifest :

<action android:name="com.yourdomain.youapp.SETTING_UPDATE" />

2. définir le nom de l'intention :

public static final String SETTING_UPDATE = "com.yourdomain.youapp.SETTING_UPDATE";

3.Manipulation dans onReceive :

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    String strAction = intent.getAction();
    if (SETTING_UPDATE.equals(strAction)) {
        /* Do update setting */
    }
}

J'espère que cela vous aidera ^^

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