2012-07-13 43 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

你能举个例子吗?我不知道如何从活动调用widget.onUpdate()。 – artemkaxboy 2012-07-13 18:55:32

+0

我编辑了我的答案,看它给出的链接 – Martinsos 2012-07-16 01:13:51

相关问题