2010-09-03 12 views
5

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?Widget de actualización de Android desde un botón haga clic en

Nota: El widget utiliza el servicio para realizar operaciones.

Gracias de antemano.

Respuesta

1

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 particular yo tenía dos oyente clic, uno para refrescar y uno para iniciar la actividad de configuración, por lo que si desea iniciar una actividad sólo tiene que utilizar el PendingIntent.getActivity y añadir la bandera 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); 
    } 

Esperamos que esto ayude a alguien. :)

+0

intenté esto pero aún no actualiza la lista :(aquí está el mío http://stackoverflow.com/questions/39388686/how-to-refresh-widget-listview-when-button-refresh-is-clicked/39389295 # 39389295 – natsumiyu

0

Yo creo que hay que volver a cargar el widget de vista cuando el usuario haga clic en el botón c * actualización * 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 usted está recibiendo ningún problema a continuación, poner comentarios.

Happy Coding.

+0

¿se debe poner esto en 'onUpdate()'? – natsumiyu

Cuestiones relacionadas