9

所以 onUpdate 方法调用

remoteViews.setRemoteAdapter(id, R.id.listview, intent)

为了将适配器应用于小部件中的列表视图。

小部件的标题中有一个按钮,可以更改列表视图显示的数据集(假设电子邮件小部件的收件箱、发件箱、已加星标等)。当我单击该按钮时,它会将用户带到一个活动,允许他们选择要显示的数据集。进行选择后,将运行以下代码:

Intent intent = new Intent(this, WidgetReceiver.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
intent.putExtra("notify", true);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {R.xml.widget_provider});
sendBroadcast(intent);

这成功地调用了小部件的 AppWidgetProvider 类中的 onUpdate 方法。但是,如果我要在不同类型的数据集之间切换,在 2-3 次偏好更改之后,该setRemoteAdapter方法就会停止运行。我已经广泛记录了该过程,并且该方法应该调用一个服务,该服务又加载RemoteViewsService.RemoteViewsFactory该类以填充小部件及其适配器,但不会执行任何这些操作。在您更改首选项的前几次,它按预期工作。但之后就退出了。

有谁知道这里发生了什么?

4

3 回答 3

14

奇怪,但找到了解决方案。Android 似乎正在缓存您在 onUpdate 方法中使用的意图。如果您重新发送似乎具有相同意图的内容,它将不会按您预期的那样执行。

解决方案:有一个静态迭代整数,您将其作为参数包含在意图附加内容中。它为我解决了这个问题。

Intent intent = new Intent(context, WidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, currentWidgetId);
intent.putExtra("random", randomNumber);
randomNumber++;
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));

哦,安卓...

于 2012-11-02T22:32:19.500 回答
2

我前段时间遇到过这个问题。这种随机数的方法也帮助了我。

于 2013-03-05T12:34:30.277 回答
1

不幸的是,建议的方法对我不起作用。有效的是打电话 appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.list_view);

我的AppWidgetProvider类中有一个静态方法,每当我想更新小部件数据时都会调用它。我在该方法中调用了这个 notifyAppWidgetViewDataChanged 并且一切正常。现在小部件正确更新列表数据。

于 2018-04-16T11:01:40.587 回答