11
votes

Après les boutons de changement d'orientation sur un widget ne répond pas

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. XXX


6 commentaires

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.


4 Réponses :


12
votes

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);
        }
    }
}


1 commentaires

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.



0
votes

Le problème peut être dû à avoir deux boutons sur le widget, qui provoque des problèmes. Voyez ici:

http://permalink.gmane.org/gmane.comp. Handhelds.Android.Devel / 98008

ou

http://groups.google.com/group/android-developers/browse_thread/thread/578A4429C369C27C/273A5?lnk=gst&q=widget+Does+Not+ répondeur+ Orientation + changements # 273A53A96DDDD10C5

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).


0 commentaires

2
votes

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 updateAppwidget () Code> comme normal.

Exemple avec 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);
}


0 commentaires

0
votes

Si vous utilisez

RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);


0 commentaires