我在我的应用中使用DefaultSharedPreferences。我想创建一个小部件,它将切换我的偏好之一。我完成了小部件。它正在做我想要的,但如果我从其他活动改变这个偏好,小部件就不会更新。
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);
}
}
}
如何,让它工作? 感谢。
答案 0 :(得分:1)
如果您更改某些活动的首选项,则没有理由更新窗口小部件(因为它的onUpdate()函数被调用)。您应该做的是从更改了首选项的活动发送意图,意图将触发您的窗口小部件显示新数据。 发送此类意图的原因是HERE。