Actualizar Android Widget de la actividad
Tengo un widget, su configuración para que cuando haga clic en él, se abre algunos ajustes en una actividad.
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
Esto configura algunos ajustes para la aplicación. Lo que quiero lograr es que el widget actualice su vista para reflejar los cambios de configuración cuando se cierre la Actividad I. Utilizar el intervalo de actualización o cualquier otro tipo de sondeo no es apropiado para esto.
- Widget de actualización de Android desde el receptor de difusión
- Jquerymobile's Tap-hold no funciona en el emulador de móviles Opera Mobile
- Android: no se puede abrir el contenido: file: /// storage / emulated / 0
- mensaje del widget android para desbloquear
- No se puede actualizar el widget android desde BroadcastReceiver
He visto un par de lugares aquí y en los documentos Android este código utilizado:
appWidgetManager.updateAppWidget(mAppWidgetId, views);
Pero no sé cómo obtener el valor mAppWidgetId. Intenté seguir el ejemplo de una actividad de configuración de 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 nulo, así que nunca obtengo el AppWidgetID.
Ok, ahora sólo estoy divagando. ¿Qué crees que puedo hacer?
- Mostrar widgets en la vista de mapa
- Android Widget no se actualiza en la actualización de la aplicación
- ¿Usando un ToggleButton en un widget?
- Cambiar el color de la pista
- No se puede iniciar el servicio con null
- Cómo agregar widgets múltiples en una aplicación?
- OnClick PendingIntent en widget a veces no funciona
- Evitando el error FALLED BINDER TRANSACTION al actualizar muchos mapas de bits de widget
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 permite acceder al widget sin tener que conocer el 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();
Tengo que hacer todas las cosas de configuración mismo que tenía que hacer en el método onUpdate del Widget, pero ahora cada vez que salgo de mi actividad el Widget está mostrando el estado correcto.
Hay otra forma de hacerlo: pasar el ID de widget en la intención pendiente que 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 una intención de nuevo a la 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);
Sé que esto ha sido contestado y aceptado hace tiempo. Sin embargo, mientras yo estaba buscando lo mismo me encontré con una manera increíblemente simple para actualizar el widget.
Para futuros lectores:
La mejor parte, esto funciona para todas las instancias del widget y desde cualquier contexto (Actividad, Servicio, etc.)
Heres 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);
Cortesía – pegado 🙂
- Cómo convertir doble a 2 número después del punto?
- No se detectaron restricciones de gramática (DTD o esquema XML) para el documento (Android)