我有一个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,我使用了我的应用程序的包名称和类名以及库的包名称。
答案 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);