Обновление Android-виджета из активности - PullRequest
12 голосов
/ 02 ноября 2010

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

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

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

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

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.

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

Ответы [ 5 ]

17 голосов
/ 02 ноября 2010

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

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

Это позволило мне получить доступ к виджету без необходимости знать идентификатор appWidgetID.Мой окончательный код в моей активности:

        // 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 Виджета, но теперь каждый раз, когда я завершаю свою деятельность, Виджетотображение правильного состояния.

13 голосов
/ 12 октября 2011

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

Intent clickIntent=new Intent(context, MyConfigActivity.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
// you have the widgetId here, since it's 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);
8 голосов
/ 15 мая 2014

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

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

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

Вот код,

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

Предоставлено - Застрял:)

1 голос
/ 01 октября 2017

Вместо того, чтобы выполнять вызов из вашей активности, я предпочитаю отправлять запрос на широкую трансляцию в виджет для обновления. Метод 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);
}

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

0 голосов
/ 28 декабря 2018
RemoteViews view = new RemoteViews("pakagename", R.layout.widget_layout_name);
view.setTextViewText(R.id.textView_id, String.valueOf(hr + ":" + mi)); // for setting a textview
view.setCharSequence(R.id.PunchIn, "setText", "Punch In"); //for setting a button name
view.setInt(R.id.PunchIn, "setBackgroundResource", R.color.black); //for setting button color
ComponentName theWidget = new ComponentName(getActivity(), AppWidget_name.class);
AppWidgetManager manager = AppWidgetManager.getInstance(getActivity());
manager.updateAppWidget(theWidget, view);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...