Widget'ı etkinlik / hizmet / alıcıdan programlı olarak güncelleyin


97

Bunun mümkün olduğunu biliyorum, ancak ana etkinlikten widget'ımın güncellemesini tetiklemenin bir yolunu bulamıyorum. Yayınlayabileceğim genel bir niyet yok mu?

Yanıtlar:


192

Eğer varsa vardır bir kullanarak AppWidgetProvider, bunu bu şekilde güncelleyebilirsiniz:

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
Nerede ayarlarım widgetId?
Kris B

38
@KrisB, aşağıdaki yanıttan diziyi elde edin: int ids [] = AppWidgetManager.getInstance (getApplication ()). GetAppWidgetIds (new ComponentName (getApplication (), WidgetProvider.class));
MobileMon

11
Sabit kullanabilirsiniz, kodlamaya gerek yoktur:intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
Mārtiņš Briedis

3
WidgetID için R.xml.mywidget kullanmak için @gelupa yorumunu takip ETMEYİN! TAMAMEN yanlış ve sadece 4 saat hata ayıklamaya mal oldu !!! Doğru widget kimliğini almak için MobileMon çözümünü kullanın
Ilja S.

5
id'ler için: `int widgetIDs [] = AppWidgetManager.getInstance (activity) .getAppWidgetIds (yeni ComponentName (activity, widget.class));` `
abbasalim

76

Bu , bir hizmetten / veya eylemden bir pencere öğesinin nasıl güncelleneceğini araştırdığımda yardımcı oldu (ancak her Bağlamdan mümkün olabilir):

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 ay gecikmiş gibi buraya atladığımı biliyorum. Ama Andrew'a katılıyorum. Bu konudaki orijinal yöntemi denedim. Kimliklerin nasıl ele geçirildiğiyle ilgili bir şey, başarısız olmaya başlamasına neden oldu. Bu yöntem (alanların doğrudan manuel olarak güncellenmesi) daha iyi sonuç verir. En azından benim amaçlarım için.
durbnpoisn

Harika şey. Bunu nasıl yaptığınızı bilmiyorum ama Widget'ımın tüm örnekleri için sorunsuz ve sorunsuz çalışıyor. :)
Atul O Holic

bu benim için de çalıştı. Yayın ve onReceive yapmamız gerektiğini düşündüm, ancak gereksinimlerim buna mükemmel bir şekilde uyuyor
stingray_

30

Dolayısıyla, bir etkinlikten bir pencere öğesini güncellemek için bunu şu şekilde yapabilirsiniz:

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

Benim için çalışıyor :)


OnRecieve geçersiz kılma yöntemini çağırır. Ama onUpdate yöntemini nasıl çağıracağımı istiyorum.
Amit Thaper

25

Bunu dene:

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

2
Şaşırtıcı bir şekilde, sadece bu küçük cevap onu çözdü. Hala Widget sınıfını örneklemenin ve doğrudan onUpdate yöntemini çağırmanın sonuçlarını bilmiyorum, ama hey, sonunda işe yarıyor :)
Henrique de Sousa

1
Teşekkürler. Şimdi test ediyorum ve geri bildirim göndereceğim. Test edildi ve onaylandı. Merak ediyorum, farklı tipte gereçler varsa, aynı şekilde çalışacak mı? (
Çalışmak

I get always ids 0
omor

Bu, Android Oreo'da herhangi bir geçici çözüm düzeltmesi çalışmayacak mı?
sıkışmış taşma

15

Widget'ın öğelerini güncellemek için ListView, GridView veya StackView gibi bir koleksiyon kullanan bir widget ile çalışıyorsanız, şunları yapın:

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

Bu yöntem notifyAppWidgetViewDataChanged () ile, pencere öğesi öğelerini herhangi bir yeni veriyi gerçek zamanlı olarak almaya zorlayabilirsiniz.


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
Min-api seviyesi gerektirir: 11.
Anirudh Ramanathan

Harika. Döngülemenize bile gerek yok, bunun notifyAppWidgetViewDataChanged()bir dizi alan bir versiyonu var .
Lawrence Kesteloot

2

Phaethon'un Kotlin'de kabul ettiği çözüm:

    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'dan türetildiği yer:
class MyAppWidgetProvider : AppWidgetProvider() {


2

YourWidgetProvider.class'a açıkça erişiminizin olmadığı pencere aracını programlı olarak güncellemeye çalışıyorsanız, örneğin başka bir modülden veya kitaplıktan, YourWidgetProvider.class.getName () çıktılarını yakalayabilir ve bir sabit oluşturabilirsiniz:

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

Daha sonra bunu örtük olarak kullanabileceksiniz:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.