2010-12-12 15 views
8

Tengo un appwidget simple y quiero actualizarlo cuando se produce una acción en una actividad (en la misma aplicación). en onUpdate(), inmediatamente actualizo el widget, que funciona bien. En mi actividad, llamo al mismo método de actualización estático en mi appwidget que se llama en onUpdate() para actualizar las vistas. el widget no está actualizado.appwidget para Android no se actualizará de la actividad

Puedo rastrear el código directamente en el método AppWidgetManager.updateAppWidget(), y todo esto está bien, pero el widget no se actualiza.

La única diferencia posible que puedo ver es que el objeto de contexto pasado a mi método de actualización estático, cuando se llama desde el contexto de una actividad frente al contexto del método onUpdate() de un appwidget. sin embargo, hay muchos ejemplos en la web de esto, así que espero que funcione.

Respuesta

19

Sin ver su código, no estoy 100% seguro de cómo está tratando de hacerlo, sin embargo, aquí está el método que uso. Dentro de mi Activity tengo el siguiente método:

private void updateAllWidgets(){ 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, MyWidget.class)); 
    if (appWidgetIds.length > 0) { 
     new MyWidget().onUpdate(this, appWidgetManager, appWidgetIds); 
    } 
} 

Dónde MyWidget es la clase de la appwidget. Puedo llamar a este método desde cualquier lugar dentro de mi Activity para actualizar todos mis appwidgets.

+1

que hacen que las cosas funcionen, por lo que el problema debe ser que yo no era la actualización de las identificación correcta. como estaba, el widget configura un intento onclick con su id, que es recibido por la actividad, que luego le dice al widget que se actualice a sí mismo. –

+0

No creo que llamar al método onUpdate sea el enfoque correcto. Debería enviar una transmisión para AppWidgetManager.ACTION_APPWIDGET_UPDATE. – midhunhk

+0

@silverback desde un enfoque de "hacerlo correctamente", estoy de acuerdo con usted en que la forma correcta de hacerlo es enviar una transmisión. Desde un enfoque de "solo hazlo funcionar", lo anterior hará que los widgets de la aplicación se actualicen, sucios pero funcionales. –

9

En lugar de usar un método estático, aproveche el hecho de que el widget ya es un receptor de difusión y registre un intento de actualización en su manifiesto. Entonces cada vez que necesite actualizarlo de la actividad sólo llamar

//in your activity 
sendBroadcast(new Intent(MyWidget.ACTION_UPDATE).putExtra(whatever)); 



//In widget class 
public static final String ACTION_UPDATE = "com.example.UPDATE_MY_WIDGET"; 

y dentro de las etiquetas del receptor de su archivo de manifiesto

<intent-filter> 
    <action android:name="com.example.UPDATE_MY_WIDGET"/> 
</intent-filter> 
+0

estaba haciendo esto, pero lo cambié para que el widget simplemente inicie un servicio intencionado. ¿por qué? el widget realiza una operación de ejecución potencialmente larga-ish. Estaba obteniendo ANR en el widget cuando onUpdate() no regresó rápidamente. no estoy seguro de si esto está relacionado con mi problema. –

+0

sí cualquier operación larga debería usar un servicio de intención, una tarea asíncrona o algún otro tipo de enhebrado. Mi respuesta aquí es cómo informaré a su widget que es hora de comenzar la tarea, o informar a su widget que la tarea está completa y necesita actualizar su estado. – schwiz

+0

@schwiz Hace mucho tiempo, pero aún así, debe iniciar un servicio en su onUpdate() para realizar la operación larga. El receptor creo que tiene alrededor de 5 segundos para ejecutarse. Crear una AsyncTask no es adecuado porque también se eliminaría cuando se destruyera el receptor. – HGPB

Cuestiones relacionadas