Aggiorna a livello di codice il widget da attività / servizio / destinatario


97

So che è possibile, ma non riesco a trovare un modo per attivare un aggiornamento del mio widget dall'attività principale. Non c'è qualche intenzione generale che posso trasmettere?

Risposte:


191

Se si sta utilizzando una AppWidgetProvider, è possibile aggiornare in questo modo:

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
Dove ti metti widgetId?
Kris B

38
@KrisB dalla risposta seguente, ottieni l'array in questo modo: int ids [] = AppWidgetManager.getInstance (getApplication ()). GetAppWidgetIds (new ComponentName (getApplication (), WidgetProvider.class));
MobileMon

11
Puoi utilizzare una costante, non è necessario codificare:intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
Mārtiņš Briedis

3
NON seguire il commento di @gelupa per utilizzare R.xml.mywidget per widgetID! È COMPLETAMENTE sbagliato e mi è costato solo 4 ore di debug !!! USA la soluzione MobileMon per ottenere il widgetID corretto
Ilja S.

5
per gli id: `int widgetIDs [] = AppWidgetManager.getInstance (activity) .getAppWidgetIds (new ComponentName (activity, widget.class));`
abbasalim

75

Questo mi ha aiutato quando ho cercato come aggiornare un widget da un servizio / o un'azione (ma potrebbe essere possibile da ogni contesto):

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

So che sto saltando qui con 6 mesi di ritardo. Ma sono d'accordo con Andrew. Ho provato il metodo originale in questo thread. E qualcosa su come vengono acquisiti gli ID ha causato l'inizio del fallimento. Questo metodo (di aggiornare direttamente i campi manualmente) funziona meglio. Almeno per i miei scopi.
durbnpoisn

Roba impressionante. Non so come sei finito con questo ma funziona bene e senza intoppi per tutte le istanze del mio Widget. :)
Atul O Holic

questo ha funzionato anche per me. Pensavo avremmo bisogno di trasmettere e ricevere, ma le mie esigenze si adattano perfettamente a questo
stingray_

30

Quindi, per aggiornare un widget da un'attività, puoi farlo in questo modo:

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

Per me va bene :)


Chiama il metodo di override onRecieve. Ma voglio come chiamare il metodo onUpdate.
Amit Thaper

25

Prova questo:

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

2
Sorprendentemente, solo questa piccola risposta lo ha risolto. Non conosco ancora le implicazioni dell'istanza della classe Widget e della chiamata diretta del metodo onUpdate, ma ehi, finalmente funziona :)
Henrique de Sousa

1
Grazie. Lo sto provando ora e posterò un feedback. Testato e confermato funzionante. Mi chiedo se esistono diversi tipi di widget, funzionerà allo stesso modo? (+1 a proposito per il lavoro)
Si8

ottengo sempre ID 0
omor

Questo non funzionerà su Android Oreo alcuna soluzione alternativa?
stuckedoverflow

15

Se stai lavorando con un widget che utilizza una raccolta come ListView, GridView o StackView, per aggiornare gli elementi del widget, procedi come segue:

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

Con questo metodo notifyAppWidgetViewDataChanged (), puoi forzare gli elementi del widget a prelevare nuovi dati in tempo reale.


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
Richiede il livello min-api: 11.
Anirudh Ramanathan

Eccezionale. Non è nemmeno necessario eseguire il loop, esiste una versione notifyAppWidgetViewDataChanged()che richiede un array.
Lawrence Kesteloot

2

La soluzione accettata di Phaethon a Kotlin:

    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)

Dove MyAppWidgetProvider è derivato da AppWidgetProvider:
class MyAppWidgetProvider : AppWidgetProvider() {


2

Se stai tentando di aggiornare in modo programmatico il widget in cui non hai accesso esplicito a YourWidgetProvider.class, ad esempio da un altro modulo o libreria, puoi acquisire ciò che YourWidgetProvider.class.getName () restituisce e creare una costante:

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

Sarai quindi in grado di usarlo implicitamente:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.