Maj le contenu d'un AppWidget
La classe AppWidgetManager
Cette classe sert à:
- récupérer la liste des identifiants des instances de l'AppWidget installées sur l'écran d'accueil
- mettre à jour ces instances de l'AppWidget.
Par exemple toutes les instances de notre AppWidget
appWidgetManager.updateAppWidget(componentNameSurAppWidget, views);
ou sur une instance précise via l'id:
appWidgetManager.updateAppWidget(id, views);
Cette solution
étant aussi utilisée dans l'appWidget
pour traiter les maj lors du onUpdate.
Plus de détails
seront donnés sur ces méthodes lors de l'étude du risque
d'ANR et l'utilisation d'un service pour y remédier.
La finalité de la chose étant de déclencher la méthode onUpdate sur notre AppWidget.
RemoteViews
La classe RemoteViews permet de constituer l'IHM qui sera utilisée dans l'appWidget hors processus d'origine, mais depuis un processus distant.
Pour récupérer une instance RemoteViews, vous passerez au constructeur RemoteViews(String packageName, int layoutId) avec en paramètre:
Le nom du package du context (on le récupère avec la méthode String getPackageName() de Context) et l'identifiant du layout dans layoutId.
La préparation de la nouvelle mise en forme des vues se fera ensuite depuis cette instance:
Il s'agit bien de préparer la mise en forme car c'est l'AppWidgetManager qui déclenchera la maj effective.
Par exemple, pour changer le texte d'un TextView:
void setTextViewText(int viewId, CharSequence text) avec viewId l'identifiant du TextView et le nouveau text (Equivalent à TextView.setText).
void setTextViewTextSize(int viewId, int units, float size) pour changer la taille (Equivalent à setTextSize(int, float))
void setViewVisibility(int viewId, int visibility) pour gérer la visibilité (Equivalent à View.setVisibility)
Toutes les méthodes n'étant pas déclarées pour manipuler toutes les propriétés d'une view, une générique permet de palier ce manque:
void setString(int viewId, String methodName, String value)
view Id étant toujours l'Id de votre instance de View,
methodName, la méthode de la view à lancer
value, le paramètre attendu par la méthode de la view.
Une identique pour les autres types de paramètres étant disponible:
void setShort(int viewId, String methodName, short value)
void setLong(int viewId, String methodName, long value)
void setFloat(int viewId, String methodName, float value)
void setDouble(int viewId, String methodName, double value)
void setBoolean(int viewId, String methodName, boolean value)
void setBundle(int viewId, String methodName, Bundle value)
void setByte(int viewId, String methodName, byte value)
void setChar(int viewId, String methodName, char value)
...et les autres...
Pour d'autres méthodes, voyez sur le site de Google
Un point intéressant des RemoteViews sera la possibilité de positionner un listener dynamiquement (par exemple suite à une maj du contenu de l'appWidget pour activer un bouton, ...)
Création d'un filtre d'intention
Puis création d'une constante INTENT_APPWIDGET_CLICK (ou mieux, d'une ressource dans strings.xml) qui contient le nom de ce nouveau filtre d'intention.
Création d'une instance de l'intention pour gérer le Click:
Intent intentClick = new Intent(INTENT_APPWIDGET_CLICK);
On en profite pour positionner en extra l'Id de notre AppWidget, car il ne
faut pas oublier que l'utilisateur peut poser plusieurs instances de notre AppWidget,
il faut donc savoir d'où provient un clique !
intentClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
Puis, une classique création du PendingIntent qui sera envoyé.
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId,
intentClick1, 0);
Et on utilise la méthode setOnClickPendingIntent de la classe RemoteView
pour définir le listener sur la view de l'appWidget:
views.setOnClickPendingIntent(R.id.imageView, pendingIntent);
Dans l'appWidget, il faut encore ajouter dans la méthode onReceive le traitement du clique: