Android widget de ImageButton perd l'image lorsque l'écran est mis en rotation
-
27-09-2019 - |
Question
J'ai un widget sur votre écran d'accueil avec plusieurs ImageButtons qui ont des images d'arrière-plan par défaut. Grâce à l'activité de configuration, je peux changer l'image sur l'un des ImageButtons. Le problème est que lorsque l'écran est mis en rotation, l'image sur les disapears ImageButton et il revient à l'image par défaut.
Je ne sais pas pourquoi cela arrive ou comment le résoudre
La solution
Lorsque l'écran est mis en rotation est reconstruit toute appwidget en utilisant la dernière l'objet de RemoteViews vous avez passé à AppWidgetManager .updateAppWidget (). est donc très important que chaque fois que vous appelez updateAppWidget () vous passez un RemoteViews objet qui a tout mis sur ce que les besoins de widget si elle devait être complètement reconstruits, pas seulement une ou deux choses que vous souhaitez mettre à jour sur le widget affichage.
Alors, dans votre AppWidgetProvider classe , chaque fois que vous mettez à jour votre appwidget êtes, vous devez créer un objet RemoteViews, construire tous les paramètres d'affichage pour votre appwidget en utilisant cet objet, puis faire un appel à AppWidgetManager.updateAppWidget () lorsque vous avez terminé.
Je suppose que vous faites quelque chose comme ceci:
- Get RemoteViews Objet
- Définir la nouvelle image du bouton
- Appel updateAppWidget ()
- Get RemoteViews Objet
- Définir une intention en attente sur le bouton
- Appel updateAppWidget ()
Lorsque vous devez faire quelque chose comme ceci:
- Get RemoteViews Objet
- Définir la nouvelle image du bouton
- Définir une intention en attente sur le bouton
- Appel updateAppWidget ()
Autres conseils
La réponse de mbaird est celui-là.
Mais il y a une autre solution bien. La solution consiste à utiliser updateAppWidget lorsque vous créiez / mettre à jour la vue entière du widget et partiallyUpdateAppWidget lorsque vous changez seulement une partie de la vue. Ensuite, la vue est pas remis à zéro.
Exemple de mise à jour partielle (afficher une petite icône de synchronisation sur tous les widgets):
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, Widget.class));
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setViewVisibility(R.id.syncImage, View.VISIBLE);
for (int i = 0; i < appWidgetIds.length; i++) {
appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], views);
}