Android小部件无法更新 – 具有不正确的小部件ID

前端之家收集整理的这篇文章主要介绍了Android小部件无法更新 – 具有不正确的小部件ID前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在做一个小部件,并做了一些进步(我希望),但仍然无法让它做我想要的.

我有一个配置器活动,工作正常.当它关闭时,我在WordWidget类中调用updateAppWidget方法,并且窗口小部件更新随机数.

由于onClick,我无法做到随机数字的改变.根据日志,我输入onReceive()方法,但是关于它.

在日志中,我正在打印窗口小部件ID.我注意到,当从配置器活动运行时,它打印appWidgetId = 33,但是当我按下这个小部件时,它打印出appWidgetId = 24.

这是代码

  1. public class WordWidget extends AppWidgetProvider
  2. {
  3.  
  4. @Override
  5. public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds)
  6. {
  7. //This is run when a new widget is added or when the update period expires.
  8. Log.v("wotd","In onUpdate(),updating " + appWidgetIds.length + " widgets");
  9. Log.v("wotd"," the array is " + appWidgetIds.toString());
  10.  
  11. for(int x = 0; x < appWidgetIds.length; x++)
  12. {
  13. Integer appWidgetId = appWidgetIds[x];
  14.  
  15.  
  16. //Method that updates the random value
  17. updateAppWidget(context,appWidgetManager,appWidgetId);
  18. }
  19. }
  20.  
  21. @Override
  22. public void onReceive(Context context,Intent intent)
  23. {
  24. super.onReceive(context,intent);
  25. Log.v("wotd","In onReceive() with intent=" + intent.toString());
  26. if (intent.getAction().equals("android.appwidget.action.APPWIDGET_UPDATE"))
  27. {
  28. Integer mAppWidgetId;
  29. AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
  30.  
  31. Bundle extras = intent.getExtras();
  32. if(extras != null)
  33. {
  34. Log.v("wotd","In onReceive(),extras is valid");
  35. mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
  36.  
  37. //If they gave us an intent without a valid widget Id,just bail.
  38. if (mAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID)
  39. {
  40. Log.v("wotd",mAppWidgetId is ok");
  41. updateAppWidget(context,mAppWidgetId);
  42. }
  43. } else
  44. {
  45. Log.v("wotd",extras is INVALID");
  46. mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
  47. }
  48. }
  49.  
  50.  
  51. }
  52.  
  53.  
  54. static void updateAppWidget(Context context,Integer appWidgetId)
  55. {
  56. Log.v("wotd","In updateAppWidget() with appWidgetId=" + appWidgetId);
  57.  
  58. //Setup onClick
  59. Intent widgetIntent = new Intent(context,WordWidget.class);
  60. widgetIntent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
  61. widgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);
  62. PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context,widgetIntent,0);
  63.  
  64. Integer nextNumb = new Random().nextInt(100);
  65. Log.v("wotd","In updateAppWidget(),nextNumb = " + nextNumb.toString());
  66.  
  67. RemoteViews remoteView = new RemoteViews(context.getPackageName(),R.layout.widgetlayout);
  68. remoteView.setTextViewText(R.id.mainText,String.valueOf(nextNumb));
  69. remoteView.setOnClickPendingIntent(R.id.mainText,widgetPendingIntent);
  70.  
  71. // Tell the widget manager
  72. appWidgetManager.updateAppWidget(appWidgetId,remoteView);
  73. }
  74. }

这是日志文件,从触摸窗口小部件(注意,prefs活动也有一个日志打印输出,并显示小部件ID作为不同的数字,这个):

  1. 05-14 17:15:47.453: V/wotd(1585): In onReceive() with intent=Intent { act=android.appwidget.action.APPWIDGET_UPDATE flg=0x10000000 cmp=com.rfxlabs.wordofthedaywidget/.WordWidget bnds=[202,177][222,201] (has extras) }
  2. 05-14 17:15:47.453: V/wotd(1585): In onReceive(),extras is valid
  3. 05-14 17:15:47.463: V/wotd(1585): In onReceive(),mAppWidgetId is ok
  4. 05-14 17:15:47.463: V/wotd(1585): In updateAppWidget() with appWidgetId=24

05-14 17:15:47.463:V / wotd(1585):在updateAppWidget()中,nextNumb = 42

所以你可以看到,我实际上输入了我的updateAppWidget方法,但由于某些原因,appWidgetId不正确.

任何想法为什么会这样发生?非常感谢!

解决方法

在您的函数updateAppWidget中,转到以下行:
  1. PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context,0);

…并将其更改为:

  1. PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context,appWidgetId,0);

猜你在找的Android相关文章