Подтвердить что ты не робот

Обновление Android-виджета от активности

У меня есть виджет, его настройка так, что, когда я нажимаю на него, он открывает некоторые настройки в активности.

views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);

Это настраивает некоторые параметры для приложения. Я хочу добиться того, чтобы виджет обновил свое представление, чтобы отразить измененные параметры, когда запуск Activity я закрывается. Использование интервала обновления или любого другого типа опроса не подходит для этого.

Я видел пару мест здесь и в андроидах, которые использовали этот код:

appWidgetManager.updateAppWidget(mAppWidgetId, views);

Но я не знаю, как получить значение mAppWidgetId. Я попробовал следующий пример для активности конфигурации виджета здесь http://developer.android.com/guide/topics/appwidgets/index.html, но в следующем коде

    Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
    mAppWidgetId = extras.getInt(
            AppWidgetManager.EXTRA_APPWIDGET_ID, 
            AppWidgetManager.INVALID_APPWIDGET_ID);
}

extras всегда имеет значение null, поэтому я никогда не получаю AppWidgetID.

Хорошо, теперь я просто бессвязно. Как вы думаете, что я могу сделать?

4b9b3361

Ответ 1

Наконец-то я нашел ответ, который я искал, это было в перегрузке функции updateAppWidget.

   appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views);

Позвольте мне получить доступ к виджету, не зная его. Тогда мой последний код в моей деятельности:

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

Мне нужно сделать все то же самое, что мне нужно было сделать в методе onUpdate Widget, но теперь каждый раз, когда я выхожу из своей активности, виджет отображает правильное состояние.

Ответ 2

Другой способ сделать это - передать идентификатор виджета в ожидающем намерения, которое вы используете для запуска активности:

Intent clickIntent=new Intent(context, MyConfigActivity.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
// you have the widgetId here, since it your onUpdate
PendingIntent pendingIntent=PendingIntent
        .getActivity(context, 0,
                clickIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);

Кроме того, чтобы избежать дублирования кода из onUpdate(), вы можете передать намерение обратно 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);

Ответ 3

Я знаю, что на это был дан ответ и принят раньше. Однако, пока я искал одно и то же, я наткнулся на просто простой способ обновления виджета.

Для будущих читателей:

Лучшая часть, это работает для всех экземпляров виджета и из любого контекста (Activity, Service и т.д.)

Вот код,

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

Courtesy - Stuck:)

Ответ 4

Вместо того, чтобы выполнять вызов из вашей активности, я предпочитаю отправлять широкоформатный запрос на получение виджета для обновления. Метод onUpdate будет запущен, и все макеты виджетов будут переданы.

Вот мой код ниже:

1- отправка широковещательной передачи из активности:

Intent intent = new Intent(ctxt, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);

int[] ids = {R.layout.appwidget};
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
ctxt.sendBroadcast(intent);

и теперь, 2- реализуем метод onUpdate:

Intent i = new Intent(ctxt, Settings.class);
PendingIntent pi = PendingIntent.getActivity(ctxt, 0, i, 0);

for (int widgetId : allWidgetIds) {
    RemoteViews remoteViews = new RemoteViews(ctxt.getPackageName(), widgetId);
    remoteViews.setTextViewText(R.id.statusMsg, msg);
    remoteViews.setOnClickPendingIntent(R.id.rootView, pi);
    AppWidgetManager mngr = AppWidgetManager.getInstance(ctxt);
    ComponentName wdgt = new ComponentName(ctxt, MyAppWidgetProvider.class);
    mngr.updateAppWidget(wdgt, remoteViews);
}

Вот и все! Я хочу, чтобы это помогло вам:)