2010-09-03 4 views
5

У меня есть виджет, который показывает некоторые данные из базы данных. Виджет периодически обновляется каждые один час. Но я также позволяю пользователю обновлять его вручную, нажав кнопку обновления на виджет. Как я могу выполнить действие click и обновить виджет?Android-обновление виджета нажатием кнопки

Примечание: виджет использует службу для выполнения операций.

Thanx заранее.

ответ

1

Я искал ответ в течение нескольких часов, и, наконец, я понял это. В вашем AppWidgetProvider, в onUpdate, цикл в ваших виджетах и ​​для каждого виджета создайте Intent (добавьте к нему идентификатор виджета и некоторые данные, чтобы сделать его уникальным, например uris намерения), затем создайте PendingIntent и назначьте его представление, в котором вы хотите создать прослушиватель кликов.

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); 
    } 

В моем конкретном случае я имел два щелчка слушателя, один для обновления и один, чтобы начать деятельность настроек, так что если вы хотите, чтобы начать активность просто использовать PendingIntent.getActivity и добавить флаг Intent.FLAG_ACTIVITY_NEW_TASK.

две комбинированные:

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); 
    } 

Надеется, что это поможет кому-то. :)

+0

Я попробовал это, но он по-прежнему не обновляет список :(вот мой http://stackoverflow.com/questions/39388686/how-to-refresh-widget-listview-when-button-refresh-is-clicked/39389295 # 39389295 – natsumiyu

0

Я думаю, вы должны перезагрузить ваш взглядвиджета, когда пользователь нажимает на * обновления переключате * п.

//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); 

Если у вас возникли проблемы, поставьте комментарий.

Счастливое кодирование.

+0

Это должно быть помещено в 'onUpdate()'? – natsumiyu

Смежные вопросы