Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AppWidgetManager.getAppWidgetIds in activity returns an empty list

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.

like image 945
Ran Avatar asked Nov 28 '13 19:11

Ran


2 Answers

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();
like image 117
sigrlami Avatar answered Nov 09 '22 07:11

sigrlami


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);
    }
like image 34
Ethan_AI Avatar answered Nov 09 '22 07:11

Ethan_AI