活动中的AppWidgetManager.getAppWidgetIds返回一个空列表

时间:2013-11-28 19:26:45

标签: android android-appwidget

我有一个appwidget,我正试图从活动中更新。

要做到这一点,我需要appwidget id。

我使用了AppWidgetManager.getAppWidgetIds,但它总是返回一个空列表。

我还使用了AppWidgetManager.getInstalledProviders来确保我的ComponentName是正确的,但我仍然得到一个空列表。

我已经看到了关于此的所有其他问题,但我找不到对我有用的东西。

还有另一种解决方法吗?或其他更新小部件的方法?

我的代码:

ComponentName name = new ComponentName(packageName, boardcastReceiverClass);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
int[] ids = appWidgetManager.getAppWidgetIds(name);
if (ids != null && ids.length > 0) {
   getApplicationContext().sendBroadcast(getUpdateIntent(ids[0]));
}

感谢。

更新:我应该提一下我的AppWidgetProvider是在一个库项目中。根据我使用getInstalledProviders获得的ComponentName,我使用了我的应用程序的包名称和类名以及库的包名称。

3 个答案:

答案 0 :(得分:13)

您可以在不知道ID的情况下访问您的小部件

appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(),Widget.class.getName()), views);

这使您可以访问窗口小部件而无需知道“appWidgetID”。然后在活动中:

Intent intent = new Intent(this, Settings.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views);
finish();

答案 1 :(得分:1)

我正在做类似的事情,这是我让它工作的最简单方法。

在您的服务类中,将其放在您想要触发窗口小部件更新的任何位置:

Intent brIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
sendBroadcast(brIntent);

这将导致调用AppWidgetProvider类中的onReceive(Context context,Intent intent)方法。然后onRecieve可以调用代码来更新小部件。对于样本,这是我使用的。我只是更新小部件的文本:

        //Sample output text
    String text = "My cat's name is wiggles.";
    //get an AppWidgetManager
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    //getComponentName
    ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class);
    //get the IDs for all the instances of this widget
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
    //update all of the widgets
    for (int widgetId : allWidgetIds) {
        //get any views in this instance of the widget
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        // Set the text
        remoteViews.setTextViewText(R.id.widgetField,  text);
        //update the widget with any change we just made
        appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }

答案 2 :(得分:0)

要获取应用小部件ID ..请使用以下代码

onReceive()方法使用下面的代码

int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);

在onUpdate()中,你会得到id列表作为参数!

如果您想从活动中更新它,请使用此

 Intent intent = new Intent(this, [activityname].class);
    intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
    int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), [activityname].class));
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
    sendBroadcast(intent);