artemkaxboy
artemkaxboy

Reputation: 628

Widget should show actual prefs

I use DefaultSharedPreferences in my app. And I want create a widget which will toggle one of my preference. I done the widget. And it's doing what I want, but if I change this preference from other activity, widget dosen't update.

public class WidgetReceiver extends AppWidgetProvider {
    public static String ACTION_WIDGET_TOGGLE = "ActionToggle";

    public void onUpdate( Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds ) {
        RemoteViews remoteViews = new RemoteViews( context.getPackageName(), R.layout.widget_on_off );

        boolean state = PreferenceManager.getDefaultSharedPreferences( context ).getBoolean( "serviceOn", true );
        if( state )
            remoteViews.setImageViewResource( R.id.widgetImage, R.drawable.ic_widget );
        else
            remoteViews.setImageViewResource( R.id.widgetImage, R.drawable.ic_widget_dark );

        Intent intent = new Intent( context, WidgetReceiver.class );
        intent.setAction( ACTION_WIDGET_TOGGLE );
        PendingIntent pendingIntent = PendingIntent.getBroadcast( context, 0, intent, 0 );
        remoteViews.setOnClickPendingIntent( R.id.widgetImage, pendingIntent );

        appWidgetManager.updateAppWidget( appWidgetIds, remoteViews );
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if( AppWidgetManager.ACTION_APPWIDGET_DELETED.equals( action )) {
            final int appWidgetId = intent.getExtras().getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID );
            if ( appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID ) {
                this.onDeleted( context, new int[] { appWidgetId });
            }
        } else {
            if( intent.getAction().equals( ACTION_WIDGET_TOGGLE )) {
                boolean state = !PreferenceManager.getDefaultSharedPreferences( context ).getBoolean( "serviceOn", true );
                Editor editor = PreferenceManager.getDefaultSharedPreferences( context ).edit();
                editor.putBoolean( "serviceOn", state );
                editor.commit();
                ComponentName thisAppWidget = new ComponentName( context.getPackageName(), WidgetReceiver.class.getName());
                AppWidgetManager appWidgetManager = AppWidgetManager.getInstance( context );
                int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);
                onUpdate( context, appWidgetManager, appWidgetIds);
            }
            super.onReceive(context, intent);
        }
    }
}

How, make it work? Thanks.

Upvotes: 2

Views: 183

Answers (1)

Martinsos
Martinsos

Reputation: 1693

if you change preference from some activity, there is no reason for widget to update (for its onUpdate() function to be called). What you should do is send intent from activity that changed preference, intent that will trigger your widget to display new data. Sending such kind of intent is explained HERE.

Upvotes: 1

Related Questions