2010-06-20 11 views
7

Tengo un error extraño con un widget que he codificado: después de que la pantalla gira el widget deja de responder a eventos onClick. El código es exactamente el mismo que en la Documentación del desarrollador de Android para Widgets de aplicaciones here. Me he dado cuenta de que otros widgets del mercado no tienen este problema, ¿hay alguna solución conocida tal vez? He intentado hacer tapping por todos lados después de una rotación, así que no creo que sea onClickPendingIntent que no haya cambiado de tamaño después de una rotación; no parece estar presente en absoluto.Rotación de pantalla automática Deshabilitar widget RemoteView onClick evento

no puedo encontrar una onRotation() tipo de disparador para el AppWidgetProvider para rehacer el código de escucha en el caso de una rotación, así que estoy bastante seguro de cómo proceder ...

Gracias!

Respuesta

3

Recibí la siguiente respuesta de una publicación que hice en Grupos de Google que resolvió mi problema. No puedo decir si resolvería el problema del póster original, pero pensé que lo publicaría, en caso de que alguien más se encuentre con este problema. El enlace a mi mensaje Grupos de Google es:

http://groups.google.com/group/android-developers/browse_thread/thread/ca8c2958b6dc086c#


No hay onUpdate en los cambios de configuración. La pantalla de inicio recrea su widget, luego toma las RemoteViews más recientes y las aplica al widget .

Me imaginé que estaba recreando el Widget en rotación. El problema es que parece que no recibo ningún mensaje al respecto y tengo de ninguna manera (que pueda ver) para restablecer la conexión. ¿Cómo puedo determinar que ha ocurrido una rotación y configurar una nueva conexión onClick ?

Como dije, no lo hace (determinar o responder a un cambio de orientación).

Lo que se hace, es asegurarse de que cada vez que el código empuja un objeto RemoteViews en el inicio de la aplicación del widget, es completa en todos los aspectos:

  • contenga identificadores de recursos de imagen;
  • Tiene picaduras de texto;
  • tiene intenciones pendientes.

No hacer actualizaciones de los widgets "incrementales", igual que lo haría con un actividad regular - no fijan los intentos primero, luego las imágenes, a continuación, el texto que refleja la información actual.

La aplicación de inicio se ejecuta como un proceso separado, y su estado puede salirse del paso con su receptor de widgets. Cuando lo hace, lo único que tiene para volver a crear su widget es su objeto RemoteViews más reciente. Si está completo y tiene todas las piezas, todo funcionará perfectamente. Si solo tiene el cambio de texto o imagen más reciente, se perderán las actualizaciones anteriores que tenían los intentos .

http://kmansoft.wordpress.com/2010/05/23/widgets-and-orientation-chan ...

- Kostya

0

El siguiente código parece como ser capaz de resolver el problema.

@Override 
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { 
    super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); 
    onUpdate(context, appWidgetManager, new int[] {appWidgetId}); 
} 
0

En primer lugar, asegúrese de que sus RemoteViews es una representación completa del estado del widget si está llamando AppWidgetManager.updateAppWidget(). Configure todos los intentos pendientes, vea datos, etc. Este estado se reutilizará cuando el iniciador desee restaurar su widget desde el estado, por ej. cuando la rotación cambia

Cuando desee actualizar sus vistas remotas pero no desea proporcionar una representación completa de RemoteViews, es decir. solo quiere cambiar un estado de vista remota existente, puede usar AppWidgetManager.partiallyUpdateAppWidget().

Esta actualización se diferencia de updateAppWidget (int, RemoteViews) en ese objeto los RemoteViews que se hace pasar se entiende que es un representación incompleta del widget, y por lo tanto no se almacena en caché por el AppWidgetService. Tenga en cuenta que debido a que estas actualizaciones no están almacenadas en caché, cualquier que modifiquen que no se restaure mediante restoreInstanceState no persistirá en el caso de que los widgets se restauren utilizando la versión en caché en AppWidgetService. Usar con RemoteViews.showNext (int), RemoteViews.showPrevious (int), RemoteViews.setScrollPosition (int, int) y comandos similares.

Por ejemplo, cuando el avance de un ViewPager para un widget fuera de onUpdate:

final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget_4x2); 
remoteViews.showNext(R.id.appWidget_viewFlipper); 
appWidgetManager.partiallyUpdateAppWidget(widgetId, remoteViews); 
Cuestiones relacionadas