I have an appwidget that I'm trying to update from an activity.
To do that, I need the appwidget id.
I've used AppWidgetManager.getAppWidgetIds
but it always returns an empty list.
I also used AppWidgetManager.getInstalledProviders
to make sure that my ComponentName
is correct, but still I get an empty list.
I've seen all the other questions about this, but I couldn't find something that worked for me.
Is there another way to solve this? or another way to update the widget?
My code:
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]));
}
Thanks.
UPDATE: I should mention that my AppWidgetProvider is in a library project. According to the ComponentName I get with getInstalledProviders
, I used the package name of my app and the class name with the package name of the library.
You can access your widget without knowing id
appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(),Widget.class.getName()), views);
This let you access the widget without having to know the 'appWidgetID'. Then in activity:
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();
I'm working on something similar and here is the simplest way I got it to work.
In your service class put this wherever you want to trigger a widget update:
Intent brIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
sendBroadcast(brIntent);
This will cause the onReceive(Context context, Intent intent) method in your AppWidgetProvider class to be called. Then onRecieve can call code to update the widget. For a sample, here's what I used. I'm merely updating the text of the widget:
//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);
}
To get the app widget ID.. use this below code
onReceive() method use this below code
int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
in onUpdate() you get the list of ids already as the parameter!
If you want to update it from activity use this
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);