2010-11-01 15 views
12

Tengo un widget, su configuración para que cuando haga clic en él, abra algunas configuraciones en una actividad.Actualizar Android Widget From Activity

views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

Esto configura algunos ajustes para la aplicación. Lo que quiero lograr es hacer que el widget actualice su vista para reflejar las configuraciones modificadas cuando se cierre la actividad I de lanzamiento. Usar el intervalo de actualización o cualquier otro tipo de sondeo no es apropiado para esto.

que he visto un par de lugares aquí y en la documentación androide este código utilizado:

appWidgetManager.updateAppWidget(mAppWidgetId, views); 

Pero no sé cómo obtener el valor mAppWidgetId. Probé siguiendo el ejemplo de una actividad de configuración del widget aquí http://developer.android.com/guide/topics/appwidgets/index.html, pero en el siguiente código,

Intent intent = getIntent(); 
Bundle extras = intent.getExtras(); 
if (extras != null) { 
    mAppWidgetId = extras.getInt(
      AppWidgetManager.EXTRA_APPWIDGET_ID, 
      AppWidgetManager.INVALID_APPWIDGET_ID); 
} 

extras siempre es nula, por lo que nunca me da la AppWidgetID.

Ok, ahora solo estoy divagando. ¿Qué crees que puedo hacer?

Respuesta

17

Finalmente encontré la respuesta que estaba buscando, estaba en una sobrecarga de la función updateAppWidget.

appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); 

Esto me deja acceder el widget sin tener que conocer la appWidgetID. Mi código final en mi actividad es entonces:

 // Create an Intent to launch ExampleActivity 
    Intent intent = new Intent(this, Settings.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 

    views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
    appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); 
    finish(); 

que tengo que hacer todo lo mismo la configuración que tenía que hacer en el método onUpdate del Widget, pero ahora cada vez que salga de mi actividad el widget está mostrando el estado correcto.

+0

Gracias por compartir la respuesta! ¿Dónde tenemos que poner este código, dentro de la actividad de configuración de widgets o dentro de la clase de widgets? – BamsBamx

+0

No importa, puse esto dentro del método updateWidget, cambié algo de "this" por "context" y eliminé 'AppWidgetManager appWidgetManager = AppWidgetManager.getInstance (this)' Ahora está funcionando ... ¡gracias! – BamsBamx

+1

Si tiene varias configuraciones para los widgets, es posible que desee probar appWidgetManager.getAppWidgetIds (componente) y luego iterar sobre ellos. – rwilson04

13

Hay otra manera de hacerlo - pasar el ID del widget en la intención pendiente que se utiliza para iniciar la actividad:

Intent clickIntent=new Intent(context, MyConfigActivity.class); 
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
// you have the widgetId here, since it's your onUpdate 
PendingIntent pendingIntent=PendingIntent 
     .getActivity(context, 0, 
       clickIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

Por otra parte, para evitar la duplicación de código de onUpdate(), puede transmitir un intento de vuelta al AppWidgetProvider:

Intent intent = new Intent(this,MyAppWidgetProvider.class); 
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); 

// Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID, 
// since it seems the onUpdate() is only fired on that: 
int[] ids = {widgetId}; 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); 
sendBroadcast(intent); 
+0

Gracias por compartir el código. Ahora puedo actualizar el widget de la actividad –

8

sé que esto ha sido contestada y acepté hace camino. Sin embargo, mientras buscaba lo mismo me encontré con una manera asombrosamente simple de actualizar el widget.

Para los futuros lectores:

la mejor parte, esto funciona para todas las instancias del widget y de cualquier contexto (Actividad, servicios, etc)

Aquí está el código,

Context context = this; 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1); 
ComponentName thisWidget = new ComponentName(context, MyWidget.class); 
remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis()); 
appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

Courtesy - Stuck :)

+1

¡Esto! He luchado durante años tratando de actualizar un TextView en un widget, y esto lo resolvió. ¡¡Gracias!! :) – wislon

+0

Su más bienvenido. El placer es mío. Feliz Codificación. :) –

+0

Esto funcionó para mí ... Gracias amigo :) – user1090751

1

En lugar de hacer la llamada desde su actividad, prefiero enviar una amplia solicitud de conversión al widget para su actualización. El método onUpdate se activará y se aprobarán todos los diseños de widgets.

Aquí está mi código de abajo:

1- enviar amplio elenco de la actividad:

Intent intent = new Intent(ctxt, MyAppWidgetProvider.class); 
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 

int[] ids = {R.layout.appwidget}; 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); 
ctxt.sendBroadcast(intent); 

y ahora, 2- implementar el método onUpdate:

Intent i = new Intent(ctxt, Settings.class); 
PendingIntent pi = PendingIntent.getActivity(ctxt, 0, i, 0); 

for (int widgetId : allWidgetIds) { 
    RemoteViews remoteViews = new RemoteViews(ctxt.getPackageName(), widgetId); 
    remoteViews.setTextViewText(R.id.statusMsg, msg); 
    remoteViews.setOnClickPendingIntent(R.id.rootView, pi); 
    AppWidgetManager mngr = AppWidgetManager.getInstance(ctxt); 
    ComponentName wdgt = new ComponentName(ctxt, MyAppWidgetProvider.class); 
    mngr.updateAppWidget(wdgt, remoteViews); 
} 

Eso es lo ! Deseo que te ayude :)