Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AppWidgetProvider中的updateAppWidget不会导致更新_Android_Widget - Fatal编程技术网

Android AppWidgetProvider中的updateAppWidget不会导致更新

Android AppWidgetProvider中的updateAppWidget不会导致更新,android,widget,Android,Widget,这个问题以前已经讨论过了,但解决方法似乎不适用于我的问题 我已经创建了一个Android小部件。我正在使用安卓2.0 当收到某个特定的意图并且几乎一切正常时,小部件应该更新一个水平进度条。当广播到达小部件时,updateGUI()方法被调用。所有三个日志更新都可以在DDMS中看到 问题是progressbar没有更新 如果我使用appWidgetManager.updateAppWidget(这个小部件,updateViews);仅显示错误小部件“Problems lodaing the Wid

这个问题以前已经讨论过了,但解决方法似乎不适用于我的问题

我已经创建了一个Android小部件。我正在使用安卓2.0

当收到某个特定的意图并且几乎一切正常时,小部件应该更新一个水平进度条。当广播到达小部件时,updateGUI()方法被调用。所有三个日志更新都可以在DDMS中看到

问题是progressbar没有更新

如果我使用appWidgetManager.updateAppWidget(这个小部件,updateViews);仅显示错误小部件“Problems lodaing the 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);
    }
}

}
基于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);
}
AppWidgetManager-AppWidgetManager=AppWidgetManager.getInstance(上下文);
ComponentName thisWidget=新的ComponentName(上下文,StepWidget.class);
ids=appWidgetManager.getAppWidgetIds(此小部件);

对于(inti=0;i试试这个怎么样

将此添加到接收时的
onReceive

widgetId=intent.getIntExtra(AppWidgetManager.EXTRA\u APPWIDGET\u ID,-1)

将您的更新更改为:


appWidgetManager.updateAppWidgetWidget(widgetId,updateViews);

试试这个怎么样

将此添加到接收时的
onReceive

widgetId=intent.getIntExtra(AppWidgetManager.EXTRA\u APPWIDGET\u ID,-1)

将您的更新更改为:


appWidgetManager.UpdateAppWidgetId(widgetId,updateViews);

谢谢。但是当我使用它时,widgetId是-1。它的意图来自于一个服务,这可能意味着没有设置值。有没有其他方法来获取正确的widgetId?
int[]AppWidgetId=appWidgetManager.GetAppWidgetId(thisWidget)
请记住,这将返回所有小部件。因此,如果有多个小部件,而您只想更新一个,这可能是一个问题。我通常使用
onCreate
onDelete
方法,使用
AppWidgetManager跟踪和存储WidgetID。如果可能有多个小部件,则使用额外的APPWIDGET\u ID
EXTRA出席会议,我需要知道哪个正在更新。谢谢。但是当我使用这个时,widgetId是-1。它的意图来自于一个服务,这可能意味着没有设置该值。是否有其他方法来获取正确的widgetId?
int[]AppWidgetId=appWidgetManager.GetAppWidgetId(thisWidget)
请记住,这将返回所有小部件。因此,如果有多个小部件,而您只想更新一个,这可能是一个问题。我通常使用
onCreate
onDelete
方法,使用
AppWidgetManager跟踪和存储WidgetID。如果可能有多个小部件,则使用额外的APPWIDGET\u ID
EXTRA在场,我需要知道哪一个正在更新。