Обновление Android виджета от нажатия кнопки - PullRequest
6 голосов
/ 03 сентября 2010

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

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

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 октября 2013

Я часами искал ответ и, наконец, понял. В вашем AppWidgetProvider в onUpdate зациклите ваши виджеты и для каждого виджета создайте Intent (добавьте к нему идентификатор виджета и некоторые данные, чтобы сделать его уникальным, например, намерение URI), затем создайте 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 голосов
/ 09 ноября 2013

Я думаю, вам нужно перезагрузить виджет , когда пользователь нажимает * Обновить кнопку * 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);

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

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

...