2

アプリで DefaultSharedPreferences を使用しています。そして、私の好みの1つを切り替えるウィジェットを作成したいと思います。ウィジェットを作りました。そして、それは私が望むことをしていますが、この設定を他のアクティビティから変更すると、ウィジェットは更新されません。

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);
        }
    }
}

どのように、それを機能させますか?ありがとう。

4

1 に答える 1

1

何らかのアクティビティから設定を変更した場合、ウィジェットが更新される理由はありません (その onUpdate() 関数が呼び出されるため)。あなたがすべきことは、設定を変更したアクティビティからインテントを送信することです。これは、ウィジェットをトリガーして新しいデータを表示するインテントです。このようなインテントの送信については、こちらで説明されています。

于 2012-07-13T14:28:17.407 に答える