Reputation: 628
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
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