小部件应该显示实际的首选项

时间:2012-07-13 10:44:24

标签: android android-widget sharedpreferences

我在我的应用中使用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);
        }
    }
}

如何,让它工作? 感谢。

1 个答案:

答案 0 :(得分:1)

如果您更改某些活动的首选项,则没有理由更新窗口小部件(因为它的onUpdate()函数被调用)。您应该做的是从更改了首选项的活动发送意图,意图将触发您的窗口小部件显示新数据。 发送此类意图的原因是HERE