2010-11-16 105 views
2

我確定我錯過了一些東西,但我只是試圖用按鈕和計數器來獲取應用程序小部件。每次我點擊按鈕,我想計數器更新1.我如何更新Android appwidget的UI

我已經設置了WidgetProvider的onUpdate()函數來註冊一個掛起的事件到按鈕,以便它啓動一個服務,以衝擊計數器numbver :

Intent active = new Intent(context, CounterService.class); 
active.setAction(CounterService.COUNT); 
PendingIntent pending = PendingIntent.getService(context, 0, active, PendingIntent.FLAG_UPDATE_CURRENT); 
views.setOnClickPendingIntent(R.id.CountButton, pending); 

ComponentName component = new ComponentName(context.getPackageName(), KickCounterWidgetProvider.class.getName());  
appWidgetManager.updateAppWidget(component, views); 
在服務

然後CounterService ::在onStart()函數我碰到的計數(保存在首選項現在),然後嘗試和更新的文本字段,顯示當前計數值:

// ... bump the count here and store a string representation of it in currentCountString ... 

RemoteViews remoteView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget); 

remoteView.setTextViewText(R.id.CurrentKickCount, currentCountString); 

// apply changes to widget 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
ComponentName component = new ComponentName(getApplicationContext().getPackageName(), KickCounterWidgetProvider.class.getName());  
appWidgetManager.updateAppWidget(component, remoteView); 

明智地使用Logcat表明這一切都正常和字符串似乎是好的,但出於某種原因,對appWidgetManager.updateAppWidget()的調用由於某種原因似乎無聲無息地失敗。

我不知道它是否完全相關,但是我第一次將小部件的一個實例添加到主屏幕,甚至沒有按鈕的作用(即在提供程序中的onUpdate()中調用updateAppWidget()失敗)。對於在Provider中對updateAppWidget()的調用,該小部件的後續實例似乎可以正常工作,但從不適用於該服務。

任何幫助將不勝感激。

回答

6

來源: http://code.google.com/p/android/issues/detail?id=8889

當安裝一個插件到 剛擦的或新建的AVD, appWidgetManager.updateAppWidget調用 沒有更新相應的
部件。意向正確 收到,通常調用 ,但沒有小部件更新 發生。

如果重新啓動AVD(有或沒有 widget的軟件包安裝 在設備上)的第一個非新鮮 初始化啓動後的問題,停止對 存在。

這個問題似乎存在於2.0和 2.1上,在1.5,1.6和2.2上它的行爲與預期相同。

0

您的一般做法聽起來很合理,雖然this可能在這裏工作以及getApplicationContext()。儘管如此,你最後一段的內容表明其他的東西可能會出錯。 Here is a somewhat complicated sample project,它演示了你正在使用的模式 - 在這種情況下,隨機選擇一家餐廳而不是碰櫃檯。

+0

啊,有意思,我會檢查一下。順便說一句,我用http://github.com/commonsguy/cw-advandroid/tree/master/AppWidget/TwitterWidget/ ;-)開始了這一切。 – 2010-11-16 21:16:06

+0

@Stevil Knevil:是的,這是一個不太複雜的示例。 _Android編程教程_中的一個與你正在設置的東西類似。 – CommonsWare 2010-11-16 22:24:20

+0

這真的很奇怪,我已經根據這個例子重新實現了它,最後得到了許多更整潔的代碼!但唉,沒有改善。出於某種原因,對mgr.updateAppWidget(me,updateViews)的調用;似乎沒有工作。 這就像它更新小部件,但不強制重繪實例,因此創建新實例具有更新的UI,但創建後它們不會更改。 – 2010-11-17 21:51:21