programacion - Widget de actualización de Android desde un clic de botón
programacion android pdf 2018 (2)
He buscado una respuesta durante horas y finalmente me he dado cuenta. En AppWidgetProvider, en onUpdate, ingrese sus widgets y, para cada widget, cree un Intento (agregue el ID del widget y algunos datos para hacerlo único, como el uri intencionado), luego cree un PendingIntent y asígnelo a la vista donde desea crear el oyente de clic.
for(int i = 0; i<appWidgetIds.length; i++) {
Intent serviceIntent = new Intent(context, MyService.class);
serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent pendingServiceIntent = PendingIntent.getService(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setOnClickPendingIntent(R.id.refresh, pendingServiceIntent);
context.startService(serviceIntent);
appWidgetManager.updateAppWidget(appWidgetIds[i], views);
}
En mi caso específico, tenía dos oyentes de clics, uno para actualizar y uno para iniciar la actividad de configuración, por lo que si desea iniciar una actividad simplemente use PendingIntent.getActivity y agregue el indicador Intent.FLAG_ACTIVITY_NEW_TASK.
Los dos combinados:
for(int i = 0; i<appWidgetIds.length; i++) {
Intent serviceIntent = new Intent(context, MyService.class);
serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent pendingServiceIntent = PendingIntent.getService(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Intent settingsIntent = new Intent(context, SettingsActivity.class);
settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
settingsIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
settingsIntent.setData(Uri.parse(settingsIntent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent pendingSettingsIntent = PendingIntent.getActivity(context, 0, settingsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setOnClickPendingIntent(R.id.title, pendingSettingsIntent);
views.setOnClickPendingIntent(R.id.refresh, pendingServiceIntent);
context.startService(serviceIntent);
appWidgetManager.updateAppWidget(appWidgetIds[i], views);
}
Espero que esto ayude a alguien. :)
Tengo un widget que muestra algunas informaciones de la base de datos. El widget se actualiza periódicamente cada una hora. Pero también dejo que el usuario lo actualice manualmente haciendo clic en un botón de actualización en el widget. ¿Cómo puedo realizar la acción de hacer clic y actualizar el widget?
Nota: El widget usa el servicio para realizar operaciones.
Gracias por adelantado.
Creo que tienes que volver a cargar la vista del widget cuando el usuario haga clic en * refresh butto * n.
//for refresh button
Intent refresh = new Intent(ctxt, WatchWidget_Honeycomb.class);
PendingIntent refreshIntent = PendingIntent.getBroadcast(ctxt, 0, refresh, 0);
widget.setOnClickPendingIntent(R.id.btn_Refresh, refreshIntent);
appWidgetManager.updateAppWidget(new ComponentName(ctxt,WatchWidget_Honeycomb.class), widget);
Si tiene algún problema, ponga un comentario.
Feliz Codificación.