2012-07-13 3 views
2

내 앱에서 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

일부 활동에서 환경 설정을 변경하면 위젯이 (onUpdate() 기능을 호출하기 위해) 업데이트 할 이유가 없습니다. 당신이해야 할 일은 우선 순위를 바꾼 활동으로부터 의도를 보내고, 당신의 위젯이 새로운 데이터를 표시하게 할 의도입니다. 그런 의도를 보내는 것은 HERE으로 설명되어 있습니다.

+0

예를 들어 주시겠습니까? activity에서 widget.onUpdate()를 호출하는 방법을 모르겠습니다. – artemkaxboy

+0

내 대답을 편집했습니다. 주어진 링크를 참조하십시오. – Martinsos

관련 문제