2010-05-01 14 views
10

Respondo a un botón presiona mi appwidget en el método onreceive. Cuando presiono el botón, quiero forzar que el widget llame al método onupdate. ¿Cómo logro esto?Force Widget de Android para actualizar

¡Gracias de antemano!

+0

Creo que es este comando: \t \t \t appWidgetManager.updateAppWidget (appWidgetId, vistas); De todos modos, ¿cómo lo haces para responder a alguien haciendo clic en él? Lo pregunté en una pregunta aquí: http://stackoverflow.com/questions/2748590/clickable-widgets-in-android –

+0

ver http://stackoverflow.com/questions/2748590/clickable-widgets-in-android/2748759 # 2748759 – larham1

Respuesta

9

Widget no puede responder a los clics porque no se trata de un proceso separado. Pero puede iniciar servicio para procesar el comando:

public class TestWidget extends AppWidgetProvider { 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 

     // Perform this loop procedure for each App Widget that belongs to this provider 
     for (int i=0; i<N; i++) { 
      int appWidgetId = appWidgetIds[i]; 

      // Create an Intent to launch UpdateService 
      Intent intent = new Intent(context, UpdateService.class); 
      PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

      // Get the layout for the App Widget and attach an on-click listener to the button 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout); 
      views.setOnClickPendingIntent(R.id.button, pendingIntent); 

      // Tell the AppWidgetManager to perform an update on the current App Widget 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 
    } 

    public static class UpdateService extends Service { 
     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      //process your click here 
      return START_NOT_STICKY; 
     } 
    } 
} 

También debe registrar el nuevo servicio en su archivo de manifiesto:

<service android:name="com.xxx.yyy.TestWidget$UpdateService"> 

puede encontrar otro ejemplo de aplicación UpdateService en la muestra Wikcionario en SDK

Y aquí es otro buen enfoque Clickable widgets in android

+0

El enlace "otro buen enfoque" contradice un poco su declaración inicial. Los widgets pueden responder a los clics sin necesidad de un servicio involucrado mediante el uso del controlador onReceive con una intención que se envía al hacer clic en el elemento del widget. No tener un servicio involucrado es una mejor solución en mi opinión. –

+0

onInicie en ahora DEPRECATED –

3

Esto es un poco crudo, pero funciona bastante bien para mí, ya que he encontrado ninguna d manera implementada de forma directa para forzar una actualización.

public class Foo extends AppWidgetManager { 
    public static Foo Widget = null; 
    public static Context context; 
    public static AppWidgetManager AWM; 
    public static int IDs[]; 

    public void onUpdate(Context context, AppWidgetManager AWM, int IDs[]) { 
     if (null == context) context = Foo.context; 
     if (null == AWM) AWM = Foo.AWM; 
     if (null == IDs) IDs = Foo.IDs; 

     Foo.Widget = this; 
     Foo.context = context; 
     Foo.AWM = AWM; 
     Foo.IDs = IDs; 
....... 
    } 
} 

Ahora, en cualquier lugar que desea forzar el widget para actualizar, es tan simple como:

if (null != Foo.Widget) Foo.Widget.onUpdate(null, null, null); 
+0

Si el usuario tiene dos instancias de sus widgets, solo se actualizará una. –

+1

@Kernald Luego debe haber actualizado solo uno de los ID en 'IDs []'. Bucle sobre todos ellos. – Izkata

Cuestiones relacionadas