Програмно оновити віджет від діяльності / послуги / приймача


97

Я знаю, що це можливо, але я не можу знайти спосіб запустити оновлення свого віджета від основної діяльності. Чи не існує якихось загальних намірів, які я можу транслювати?

Відповіді:


191

Якщо будуть використовуючи AppWidgetProvider, ви можете оновити його таким чином:

Intent intent = new Intent(this, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.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 = AppWidgetManager.getInstance(getApplication())
    .getAppWidgetI‌​ds(new ComponentName(getApplication(), MyAppWidgetProvider.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
sendBroadcast(intent);

30
Де ви встановлюєте widgetId?
Кріс Б

38
@KrisB з відповіді нижче, отримайте масив, зробивши це: int ids [] = AppWidgetManager.getInstance (getApplication ()). GetAppWidgetIds (нове ComponentName (getApplication (), WidgetProvider.class));
MobileMon

11
Ви можете використовувати константу, не потрібно вводити intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
жорсткий код

3
НЕ слідкуйте за коментарем @gelupa, щоб використовувати R.xml.mywidget для widgetID! Це ПОЛІТНО неправильно і просто коштувало мені 4 години налагодження !!! Використовуйте рішення MobileMon, щоб отримати правильний віджетID
Ilja S.

5
для id: `int widgetIDs [] = AppWidgetManager.getInstance (активність) .getAppWidgetIds (нове ім’я ComponentName (активність, widget.class));`
abbasalim

75

Це допомогло, коли я шукав, як оновити віджет із послуги / чи дії (але можливо це можливо з кожного контексту):

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

Я знаю, що я стрибаю сюди, як на 6 місяців. Але я згоден з Андрієм. Я спробував оригінальний метод у цій темі. І щось про те, як схопили посвідчення особи, призвело до того, що воно почало виходити з ладу. Цей спосіб (безпосередньо оновлення полів вручну) працює краще. Принаймні для моїх цілей.
durbnpoisn

Дивовижні речі. Не знаю, як ви закінчилися цим, але працює добре і гладко для всіх примірників мого віджета. :)
Атул О Холік

це працювало і для мене. Я думав, що нам потрібно буде робити трансляцію та onReceive, але мої вимоги цілком відповідають цьому
stingray_

30

Отже, щоб оновити віджет із діяльності, ви можете це зробити так:

Intent intent = new Intent(this, DppWidget.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), DppWidget.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
sendBroadcast(intent);

Для мене працює :)


Він називає метод переоцінки onRecieve. Але я хочу, як викликати метод оновлення.
Аміт Тапер

25

Спробуйте це:

int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MyWidget.class));
        MyWidget myWidget = new MyWidget();
        myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids);

2
Дивно, але лише ця маленька відповідь вирішила це. Я досі не знаю наслідків створення екземпляра класу віджетів та прямого виклику методу onUpdate, але ей, він, нарешті, працює :)
Анріке де Суса,

1
Дякую. Я тестую це зараз і опублікую відгук. Випробуваний та підтверджений робочий. Мені цікаво, якщо існують різні типи віджетів, чи працюватимуть вони однаково? (+1 до речі для роботи)
Si8

я завжди отримую ідентифікатори 0
оморов

Це не допоможе на Android Oreo будь-яке виправлення?
застряг над потоком

15

Якщо ви працюєте з віджетом, який використовує колекцію, таку як ListView, GridView або StackView, для оновлення елементів віджету виконайте наступні дії:

Context context = getApplicationContext();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, StackWidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.stack_view);

За допомогою цього методу notifyAppWidgetViewDataChanged () ви можете змусити елементи віджетів отримувати будь-які нові дані в режимі реального часу.


12
int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));

for (int id : widgetIDs)
    AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view);
}

1
Потрібен мінімальний рівень: 11.
Аніруд Рамананат

Дивовижно. Вам навіть не потрібно циклічити, є версія, notifyAppWidgetViewDataChanged()яка займає масив.
Лоуренс Кестелут

2

Прийняте рішення Phaethon у Котліні:

    val intent = Intent(this, MyAppWidgetProvider::class.java)
    intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
    val ids = AppWidgetManager.getInstance(application).getAppWidgetIds(ComponentName(getApplicationContext(),MyAppWidgetProvider::class.java!!))
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
    sendBroadcast(intent)

Звідки MyAppWidgetProvider походить від AppWidgetProvider:
class MyAppWidgetProvider : AppWidgetProvider() {


2

Якщо ви намагаєтесь програмно оновити віджет там, де у вас немає явного доступу до YourWidgetProvider.class, наприклад, з іншого модуля або бібліотеки, ви можете зафіксувати, що виводить YourWidgetProvider.class.getName (), і створити константу:

val WIDGET_CLASS_NAME = "com.example.yourapplication.YourWidgetProvider"

Тоді ви зможете використовувати це неявно:

val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE)
val widgetManager = AppWidgetManager.getInstance(context)
val ids = widgetManager.getAppWidgetIds(ComponentName(context, WIDGET_CLASS_NAME))
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(ids, android.R.id.list)
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
context.sendBroadcast(intent)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.