此問題之前已經討論過,但解決方案似乎並不適用於我的問題。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。
謝謝。但是當我使用這個時,widgetId是-1。意圖是來自服務,這可能意味着價值沒有設置。有沒有另一種方法來獲得正確的widgetId? –
'int [] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);' 請記住,這將返回所有小部件。所以如果有多個,而你只想更新一個,這可能是一個問題。 – jawsware
我通常使用'AppWidgetManager.EXTRA_APPWIDGET_ID'通過'onCreate'和'onDelete'方法跟蹤和存儲widgetIds,當多個widget可能存在時,我需要知道哪一個正在更新。 – jawsware