2011-12-06 39 views
1

此問題之前已經討論過,但解決方案似乎並不適用於我的問題。AppWidgetProvider中的updateAppWidget不會導致更新

我已經創建了一個Android Widget。我正在使用android 2.0。

當收到某個Intent並且幾乎一切正常時,Widget應該更新水平進度條。廣播到達小部件,調用updateGUI()方法,所有三個日誌記錄更新可以在DDMS中看到。

問題是,進度條沒有更新。

如果我使用appWidgetManager.updateAppWidget(thisWidget,updateViews);只顯示錯誤小工具「顯示小部件的問題」,但沒有這一行,我不知道如何更新。

整個Widget看起來像這樣,開始服務和receiviung更新工作正常。

package org.ambientdynamix.applications.stepviz3; 


import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.widget.ProgressBar; 
import android.widget.RemoteViews; 

public class StepWidget extends AppWidgetProvider { 

// Classname for logging purposes 
private final String TAG = "StepWidget"; 
private final String APPWIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE"; 
StepCounterService mService; 
boolean mBound = false; 
Context context; 
int[] ids; 
int x=0; 

@Override 
public void onUpdate(Context thecontext, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
{ 
    Log.i(TAG, "onUpdate()"); 
    context=thecontext; 
    ids=appWidgetIds; 
    //Start Service 
    Intent intent = new Intent(context, StepCounterService.class); 
    context.startService(intent); 
    super.onUpdate(thecontext, appWidgetManager, appWidgetIds); 
} 

@Override 
public void onReceive(Context thecontext, Intent intent) 
{ 
    context=thecontext; 
    if (intent.getAction().equals(APPWIDGET_UPDATE)) 
    { 
     int p = intent.getExtras().getInt("steps"); 
     x=p; 
     Log.i(TAG, "WIDGET: YEAH! TOAST!"+x); 
     updateGUI(); 
    } 
    super.onReceive(thecontext, intent); 
} 

private void updateGUI() 
{ 
    if(context!=null) 
    { 
     Log.i(TAG, "WIDGET: Update "+x); 
     RemoteViews updateViews = null; 
     updateViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
     updateViews.setProgressBar(R.id.progressBarX, 100, x, false); 
     Log.i(TAG, "WIDGET: Update2 "+x); 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     //appWidgetManager.updateAppWidget(ids, updateViews); 
     ComponentName thisWidget = new ComponentName(context, StepWidget.class); 
     //appWidgetManager.updateAppWidget(thisWidget, updateViews); 
     Log.i(TAG, "WIDGET: Update3 "+x); 
    } 
} 

} 

哈克解決方案通過jawsware

OK基礎上的提示,有一個黑客的解決方案:

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
ComponentName thisWidget = new ComponentName(context, StepWidget.class); 
ids=appWidgetManager.getAppWidgetIds(thisWidget); 
for(int i=0; i<ids.length; i++) 
{ 
appWidgetManager.updateAppWidget(ids[i], updateViews); 
} 

的problemw爲,與該ID的數組爲空,所以不能找到視圖。但是,這會升級所有這種類型的Widgets。

回答

1

試試這個怎麼樣?

一下添加到onReceive

widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)

您的更新改成這樣:

appWidgetManager.updateAppWidget(widgetId, updateViews);

+0

謝謝。但是當我使用這個時,widgetId是-1。意圖是來自服務,這可能意味着價值沒有設置。有沒有另一種方法來獲得正確的widgetId? –

+0

'int [] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);' 請記住,這將返回所有小部件。所以如果有多個,而你只想更新一個,這可能是一個問題。 – jawsware

+0

我通常使用'AppWidgetManager.EXTRA_APPWIDGET_ID'通過'onCreate'和'onDelete'方法跟蹤和存儲widgetIds,當多個widget可能存在時,我需要知道哪一個正在更新。 – jawsware

相關問題