J'ai deux boutons sur un widget qui modifient des éléments dans un widget, si une orientation est modifiée sur un téléphone, les boutons ne font rien. J'ai lu http://developer.android.com/guide/topics/resources /Runtime-changes.html Mais tout cela concerne l'activité pas widget.
4 Réponses :
Je suggérerais de créer un service (éventuellement sous-classant cela dans votre appwidgetProvider) et de remplacer la méthode OnconfigurationChanged (). L'utilisation du service vous permettra de déléguer votre logique commerciale à gérer par le service, créez et mettez à jour votre widget. Cela vous permettra également de gérer des rotations. Et si vous effectuez des opérations de blocage, le service serait un bon endroit pour apparaître un fil d'accumulation et renvoyer le résultat au fil de l'UI principal pour éviter les ANR.
Je suggérerais quelque chose comme ce qui suit: P>
public class MyWidget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { context.startService(new Intent(context, MyUpdateService.class)); } public static class MyUpdateService extends Service { @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); // Update the widget RemoteView remoteView = buildRemoteView(this); // Push update to homescreen pushUpdate(remoteView); // No more updates so stop the service and free resources stopSelf(); } public RemoteViews buildRemoteView(Context context) { RemoteView updateView = null; updateView = new RemoteViews(context.getPackageName(), R.layout.my_widget_layout); // Your code to build and update the remote view return updateView; } @Override public void onConfigurationChanged(Configuration newConfig) { int oldOrientation = this.getResources().getConfiguration().orientation; if(newConfig.orientation != oldOrientation) { // Update the widget RemoteView remoteView = buildRemoteView(this); // Push update to homescreen pushUpdate(remoteView); } } private void pushUpdate(RemoteView remoteView) { ComponentName myWidget = new ComponentName(this, MyWidget.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(myWidget, updateViews); } } }
Le code sur la méthode OnConfigurationChanged n'a aucun sens. Votre valeur de vieillesse sera toujours la valeur d'orientation que le NewConfig disposera de la configuration actuelle après la modification de l'orientation. Mais +1 pour l'idée de détecter le changement d'orientation sur le widget.
Le problème peut être dû à avoir deux boutons sur le widget, qui provoque des problèmes. Voyez ici: P>
http://permalink.gmane.org/gmane.comp. Handhelds.Android.Devel / 98008 P>
ou p>
Mais ce n'est pas encore clair quelle est la vraie solution (une solution qui n'a pas besoin de créer un service de fond). P>
Chaque fois que vous mettez à jour le look de votre widget (à l'aide d'une activité ou de votre récepteur de diffusion [fournisseur de widget de diffusion]), vous devez également réaffecter tous les pancartants pour les gestionnaires de clic, puis appeler Exemple avec updateAppwidget () Code> comme normal.
SetextStVietText () Code>: P>
// This will update the Widget, but cause it to
// stop working after an orientation change.
updateWidget()
{
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
remoteViews.setTextViewText(R.id.widget_text_view, "Updated widget");
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
}
// This is the correct way to update the Widget,
// so that it works after orientation change.
updateWidget()
{
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
remoteViews.setTextViewText(R.id.widget_text_view, "Updated widget");
Intent intent = new Intent(context, MyWidgetActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, ...);
remoteViews.setOnClickPendingIntent(R.id.widget_click_button, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
}
Si vous utilisez
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
Je suppose que vous voulez dire un appwidget. Vous devriez clarifier que puisqu'il peut y avoir une confusion entre les widgets d'interface utilisateur, par exemple, un bouton et un appwidget.
Pouvez-vous publier le code à votre méthode onUpdate () dans votre fournisseur d'appwidget?
OnUpdate n'est pas appelé après un changement d'orientation, j'ai vérifié.
Les autres appwididgets fonctionnent-ils? Cela pourrait être un problème avec le lanceur d'accueil que vous utilisez.
Pouvez-vous poster du code? Comment ajoutez-vous l'auditeur OnClick aux boutons?
Ajoute toute la fonction ONUPDATE.