如何在执行小部件动作之前检查值是否已更改

问题描述:

我正在学习如何创建小部件,但我坚持了这一点。我有一个包含一个按钮的小部件,点击后会启动一个活动。但有两个活动可能启动,这取决于布尔值。如果当前Activity是MainActivity,则布尔值为true,否则为false。但是当点击按钮时,看起来布尔值在这里不会更新为新值。难道我做错了什么。任何帮助将被赏识。如何在执行小部件动作之前检查值是否已更改

public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) 
    { 

     final int N = appWidgetIds.length; 

     for (int i = 0; i < N; i++) 
     { 
      final int appWidgetId = appWidgetIds[i]; 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.rz_widget_layout); 

      Intent intent=null; 


      if(MainActivity.WidgetAppLuancherChecker){intent= new Intent(context, MainActivity.class);} 
      else{intent= new Intent(context, ActivityB.class);} 

      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 
      views.setOnClickPendingIntent(R.id.LaunchApp, pendingIntent); 

      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 
    } 

清单

<receiver android:name="com.AppWidget.ApWidgetProvider" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 
      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/info_widget_layout" /> 
     </receiver> 
+0

上面的代码应该工作,什么是iisue呢? – IshRoid 2015-03-31 06:54:19

+0

布尔值保留其默认值,不更新:/ – 2015-03-31 06:55:05

+0

更新布尔值时,我应该调用某个函数吗? – 2015-03-31 06:55:26

public static boolean getLock(Context context) { 
      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
      boolean lock = prefs.getBoolean("lock", true); 
      return lock; 
     } 

public static void setLock(Context context, boolean isMainActivity) { 

      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 

      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putBoolean("lock", isMainActivity); 
      editor.commit(); 
     } 

使用SharedPreference。您可以尝试在MainActivity中实现这两种方法。将Lock方法设置为true或false以更改布尔变量。然后下一个点击你的小工具打开你的第二课。

if(MainActivity.getLock(context)){intent= new Intent(context, MainActivity.class);} 
      else{intent= new Intent(context, ActivityB.class);} 

编辑:设置在SharedPreferences布尔变量后,您可以更新插件..

private void updateWidgetScreen(String updateData) { 

     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
     RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.widget); 
     ComponentName thisWidget = new ComponentName(this, WidgetProvider.class); 
     remoteViews.setTextViewText(R.id.currency, " Dollar"); 

     Intent intent = new Intent(this, WidgetService.class); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, MainUtils.getWidgetID(prefs)); 
     intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
     remoteViews.setRemoteAdapter(MainUtils.getWidgetID(prefs), R.id.list_view, intent); 

     Intent clickIntent = new Intent(this, MainActivity.class); 
     PendingIntent clickPI = PendingIntent.getActivity(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     remoteViews.setPendingIntentTemplate(R.id.list_view, clickPI); 
     appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

    } 
+0

感谢生病尝试在一分钟内 – 2015-03-31 07:10:25

+0

仍然没有工作,我记录的价值和它的改变活动,但我注意到,如果我在onUpdate方法中放置一个日志,那么它将只在应用程序启动时被调用一次,而不是每次我点击所以也许这是相关的 – 2015-03-31 07:20:34

试试这个,我认为它会向你::有用here

找到了解决方案使用Programmatically update widget from activity/service/receiver

当我更改活动中的布尔值时,我应该调用fol降脂:

Intent intent = new Intent(activity,ApWidgetProvider.class); 
     intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     int ids[] = AppWidgetManager.getInstance(activity.getApplication()).getAppWidgetIds(new ComponentName(activity.getApplication(), ApWidgetProvider.class)); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); 
     activity.sendBroadcast(intent); 

的onUpdate方法:

public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) 
    { 

     final int N = appWidgetIds.length; 

     for (int i = 0; i < N; i++) 
     { 
      final int appWidgetId = appWidgetIds[i]; 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.rz_widget_layout); 

      Intent intent=null; 

      int j=0; 
      if(MainActivity.WidgetAppLuancherChecker){j=1;intent= new Intent(context, MainActivity.class);} 
      else{j=2;intent= new Intent(context, ActivityB.class);} 

      PendingIntent pendingIntent = PendingIntent.getActivity(context,j,intent,PendingIntent.FLAG_UPDATE_CURRENT); 
      views.setOnClickPendingIntent(R.id.RelativeWidget, pendingIntent); 

      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 
    }