2011-12-06 42 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

相关问题