AppWidgetProvider中的updateAppWidget不会导致更新

时间:2011-12-06 15:48:39

标签: android widget

之前已经讨论过这个问题,但解决方案似乎不适用于我的问题。

我创建了一个Android Widget。我正在使用android 2.0。

当收到某个Intent并且几乎一切正常时,Widget应该更新一个水平进度条。广播到达窗口小部件,调用updateGUI()方法可以在DDMS中看到所有三个日志记录更新。

问题是,进度条没有更新。

如果我使用appWidgetManager.updateAppWidget(thisWidget,updateViews);只显示错误小组件“小部件问题”,但没有这行,我不知道如何更新。

整个Widget看起来像这样,启动服务并且接收更新工作正常。

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

}

Hack解决方案基于Tip by jawsware

好的,得到了​​一个黑客解决方案:

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

问题是,带有ids的数组为null,因此无法找到视图。但是,这将改变此类型的所有小部件。

1 个答案:

答案 0 :(得分:1)

尝试这个怎么样?

将此添加到onReceive

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

将您的更新更改为:

appWidgetManager.updateAppWidget(widgetId, updateViews);