2012-07-29 6 views
7

Estoy haciendo un widget en Android que produce un número aleatorio al hacer clic. Cuando el widget está solo en la pantalla de inicio, funciona perfectamente; sin embargo, cuando agrega varios de ellos, comienzan a generar números aleatorios al mismo tiempo. Lo que sucede es que cuando se hace clic en un widget individual, se actualizan todos; dando como resultado muchos números aleatorios. Lo que quiero es que cada widget esté aislado de los demás; Básicamente, cuando se hace clic en un widget, solo se actualiza a sí mismo y no a los demás a su alrededor. Creo que esto se puede lograr al obtener el ID del widget actual y actualizarlo solo, ya que se opuso al método de actualización actualizando todos los widgets; ¿Cómo hago esto?Actualice el ID de widget de Android actual en el método de actualización

Mi código

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    // Get all ids 
    ComponentName thisWidget = new ComponentName(context, 
      MyWidgetProvider.class); 
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
    for (int widgetId : allWidgetIds) { 
     // Create some random data 
     int number = (new Random().nextInt(100)); 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 
     Log.w("WidgetExample", String.valueOf(number)); 
     // Set the text 
     remoteViews.setTextViewText(R.id.update, String.valueOf(number)); 

     // Register an onClickListener 
     Intent intent = new Intent(context, MyWidgetProvider.class); 

     intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
       0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent); 
     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 
} 

Resumen:

Este código es el método de actualización y se llama cuando se hace clic en un widget. Quiero que este método solo actualice la identificación del widget que lo llamó, no para que este método actualice todos los ID de los widgets en la pantalla de inicio.

Respuesta

9

que tenían el mismo problema y me encontré con esta forma de resolverlo:
1.To ser capaz de distinguir entre varias instancias de la misma AppWidgetProvider, al registrar el evento “onclick” (intención) debe añadir un extra valor con el widget de Identificación (appWidgetId):

Intent clickIntent = new Intent(context, DigiStation.class); 
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, clickIntent, 0); 

2.Update solamente los puntos de vista de la instancia actual:

appWidgetManager.updateAppWidget(appWidgetId, views); 

3.Android reutiliza las intenciones, por lo que cuando se crea una intención, asegúrese poner una identificación única, o de lo contrario la misma intención utilizado antes se activará para todas las instancias:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, clickIntent, 0); 

4. Cuando el manejo del evento de clic, obtener el appWidgetId de la carga útil “extras” de la intención.
Puede encontrar más detalles útiles here.

+0

Gracias por esto, resolvió un error muy irritable. Lo más importante es colocar el único RequestCode en la llamada getBroadcast() o getActivity() para obtener el intento pendiente y evitar su reutilización tal como se explicó. Usar appWidgetId parece funcionar bien para eso. –

+0

¿qué significa el último parámetro de PendingIntent.getBroadcast()? No hay const FLAG con valor 0. – cn123h

+0

OK, probé FLAG diferente, ninguno de ellos funciona. Como Andrew y hasanghaforian mencionaron, el segundo parámetro, requestCode debe ser único para cada instancia de widget. – cn123h

Cuestiones relacionadas