2011-01-01 4 views
12
reagiert

Mögliche Duplizieren:
After orientation change buttons on a widget are not respondingNach Orientierungsänderung Tasten auf einem Widget nicht

Ich habe ein Problem mit einem appwidget gegenüber, für die man Image innerhalb des XML-Layout hat Ich registriere einen ausstehenden Inhalt, der in der OnReceive-Methode behandelt wird. Alles funktioniert gut, bis ich die Telefonausrichtung ändere. An diesem Punkt funktioniert das Widget nicht mehr, ich klicke auf das Bild, aber nichts passiert. Dieses Problem ist genau wie das hier: After orientation change buttons on a widget are not responding

Was ist das Problem und wie kann gelöst werden? Danke.

+0

Hallo, antwortete ich das Problem, das Sie in den Link identifiziert haben Sie auf dem Laufenden. Wenn Sie den Bildschirm drehen, wird das Widget neu erstellt. Wenn das Widget neu erstellt wird, müssen Sie die On-Click-Handler erneut binden, z. Hängen Sie die ausstehenden Klickereignisse erneut an. Deshalb funktioniert der Service für dieses Szenario gut. Es erfasst das onConfigurationChanged-Ereignis und bindet die Handler an die ui-Komponenten zurück. – jagsaund

+1

Vielen Dank, gelöst ohne die Hilfe eines Dienstes, setzen Sie einfach die setOnClickPendingIntent in der OnReceive-Methode. – Alex

+1

Können Sie uns sagen, wie Sie onReceive() für eine Orientierungsänderung aufgerufen haben? Ich habe das gleiche Problem, aber meine AppWidgetProvider.onReceive() wird nicht für dieses Ereignis aufgerufen. –

Antwort

9

Ich schaffte es schließlich, die Service-freie Lösung des OP neu zu erstellen. Hier ist das Geheimnis für den Rekord: Jedes Mal, wenn Sie die Remote-Ansichten aktualisieren, müssen Sie alles aktualisieren, was Sie jemals aktualisieren. Meine App hat einige visuelle Elemente aktualisiert, aber den Button-Handler nicht erneut gesetzt. Dies führte dazu, dass der Behandler nicht mehr sofort, sondern erst nach einem Rotationswechsel seine Arbeit einstellte.

Wenn dies richtig ausgeführt wird, müssen Sie keine Konfigurationswechselübertragungen abfangen, die letzten Fernansichten, die Sie festgelegt haben, werden nach der Rotation erneut verwendet. Ihr AppWidgetProvider benötigt keinen Aufruf.

2

Ich hatte ein ähnliches Problem, aber meine Anwendung gut funktioniert jetzt mit der von Alex vorgeschlagene Lösung

“... ohne die Hilfe eines Service gelöst, nur wieder das setOnClickPendingIntent in den OnReceive Einstellung Methode“

verfolgen ich die OnReceive Methode und es jedes Mal aufgerufen wird, ich die Orientierung meines Geräts zu ändern, also rief ich wieder die Konfiguration meines Widget auf der OnReceive Methode.

Wie auch immer Ich bin nicht sicher, das ist die beste Lösung, um dieses Problem zu lösen, wenn jemand eine bessere Lösung kennt bitte teilen.

Danke.

1

Wenn Sie das Aussehen Ihres Widgets aktualisieren (mit einer Aktivität oder Ihrem Broadcast-Empfänger [App widget provider]), müssen Sie alle PendingIntents für die Click-Handler neu zuweisen und dann wie gewohnt updateAppWidget() aufrufen.

Beispiel mit setTextViewText():

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