2013-11-28 19 views
5

Bir etkinlikten güncelleme yapmaya çalıştığım bir appwidget var.AppWidgetManager.getAppWidgetIds etkinliğinde boş bir liste döndürüyor

Bunu yapmak için appwidget kimliğine ihtiyacım var.

AppWidgetManager.getAppWidgetIds kullanıyorum, ancak her zaman boş bir liste döndürür.

Ayrıca ComponentName numaramın doğru olduğundan emin olmak için AppWidgetManager.getInstalledProviders kullanıyorum, ancak yine de boş bir liste alıyorum.

Bu konuyla ilgili diğer tüm soruları gördüm, ama benim için çalışan bir şey bulamadım.

Bunu çözmenin başka bir yolu var mı? Widget güncellemek için başka bir yolu?

Kodum:

ComponentName name = new ComponentName(packageName, boardcastReceiverClass); 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
int[] ids = appWidgetManager.getAppWidgetIds(name); 
if (ids != null && ids.length > 0) { 
    getApplicationContext().sendBroadcast(getUpdateIntent(ids[0])); 
} 

teşekkürler.

UPDATE: AppWidgetProvider'ın bir kitaplık projesinde olduğunu belirtmeliyim. getInstalledProviders ile aldığım ComponentName'e göre, uygulamanızın paket adını ve sınıf adını kütüphanenin paket adıyla kullandım.

+0

pay kodunuzu ... –

+0

getAppWidgetIds() kullanıcı/etkin Ana ekranda Widget kurmamış ise boş listesini döndürecektir. .. –

+0

@GopalRao evet, biliyorum. Widget ana ekranda olduğunda test ettim. – Ran

cevap

12

bu Bu 'appWidgetID' bilmek zorunda kalmadan widget'ı erişmesine izin . Daha sonra faaliyette:

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(); 
+0

Bu benim de soruma cevap gibi görünüyor, ancak parametreleri belirlerken sorun yaşıyorum. Bahsettiğiniz parametreler [appWidgetManager.updateAppWidget (yeni ComponentName (this.getPackageName(), Widget.class.getName()),]), İlk, Widget sınıfı widget sağlayıcı nedir? Widget yapılandırması Ya da widget'dan bir servis? Ve ikincisi, görüşler, herhangi bir görüş nesnesinde geçmediğim görüşler için ne ifade ediyor? Bir hizmet sınıfı içinde bir görünümün örneği ne olurdu? Yardımlarınız için şimdiden teşekkür ederiz! – Silmarilos

+0

Görüşler sorusunu kazıyın, bunun anlamı remoteViews anlamına geldiğini anladım. – Silmarilos

0

OnReceive() yöntemi zaten parametre olarak kimliklerinin listesini almak kod

altında OnUpdate içinde
int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, 
AppWidgetManager.INVALID_APPWIDGET_ID); 

() kullanmak .. uygulama widget kimliği edinme kodu

altında Bunu kullanmak için!

Eğer etkinlik kullanımından güncellemek istiyorsanız Sen kimliği

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

bilmeden Widget'ınızı erişebilirsiniz

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

Widget'ı alıcıdan değil, bir aktiviteden güncellemeye çalışıyorum, bu yüzden “OnReceieve” e sahip değilim. – Ran

1

Benzer bir şey üzerinde çalışıyorum ve işte işe koyduğum en basit yol. çağrılacak sizin AppWidgetProvider sınıfında bu OnReceive neden olur

Intent brIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
sendBroadcast(brIntent); 

(Bağlam bağlamını, Niyet niyet) yöntemini: Eğer bir widget güncelleme tetiklemek istediğiniz yere servis sınıfında

bu koydu. Daha sonra onRecieve, widget'ı güncellemek için kodu çağırabilir. Bir örnek için, benim kullandığım şey. Ben sadece aracının metnine güncelliyorum: Eğer hata olduğunu düşünüyorum

 //Sample output text 
    String text = "My cat's name is wiggles."; 
    //get an AppWidgetManager 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    //getComponentName 
    ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class); 
    //get the IDs for all the instances of this widget 
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
    //update all of the widgets 
    for (int widgetId : allWidgetIds) { 
     //get any views in this instance of the widget 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
     // Set the text 
     remoteViews.setTextViewText(R.id.widgetField, text); 
     //update the widget with any change we just made 
     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 
İlgili konular