我一直在做一个小部件,并做了一些进步(我希望),但仍然无法让它做我想要的.
我有一个配置器活动,工作正常.当它关闭时,我在WordWidget类中调用updateAppWidget方法,并且窗口小部件更新随机数.
由于onClick,我无法做到随机数字的改变.根据日志,我输入onReceive()方法,但是关于它.
在日志中,我正在打印窗口小部件ID.我注意到,当从配置器活动运行时,它打印appWidgetId = 33,但是当我按下这个小部件时,它打印出appWidgetId = 24.
这是代码:
public class WordWidget extends AppWidgetProvider { @Override public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) { //This is run when a new widget is added or when the update period expires. Log.v("wotd","In onUpdate(),updating " + appWidgetIds.length + " widgets"); Log.v("wotd"," the array is " + appWidgetIds.toString()); for(int x = 0; x < appWidgetIds.length; x++) { Integer appWidgetId = appWidgetIds[x]; //Method that updates the random value updateAppWidget(context,appWidgetManager,appWidgetId); } } @Override public void onReceive(Context context,Intent intent) { super.onReceive(context,intent); Log.v("wotd","In onReceive() with intent=" + intent.toString()); if (intent.getAction().equals("android.appwidget.action.APPWIDGET_UPDATE")) { Integer mAppWidgetId; AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); Bundle extras = intent.getExtras(); if(extras != null) { Log.v("wotd","In onReceive(),extras is valid"); mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID); //If they gave us an intent without a valid widget Id,just bail. if (mAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { Log.v("wotd",mAppWidgetId is ok"); updateAppWidget(context,mAppWidgetId); } } else { Log.v("wotd",extras is INVALID"); mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; } } } static void updateAppWidget(Context context,Integer appWidgetId) { Log.v("wotd","In updateAppWidget() with appWidgetId=" + appWidgetId); //Setup onClick Intent widgetIntent = new Intent(context,WordWidget.class); widgetIntent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); widgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId); PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context,widgetIntent,0); Integer nextNumb = new Random().nextInt(100); Log.v("wotd","In updateAppWidget(),nextNumb = " + nextNumb.toString()); RemoteViews remoteView = new RemoteViews(context.getPackageName(),R.layout.widgetlayout); remoteView.setTextViewText(R.id.mainText,String.valueOf(nextNumb)); remoteView.setOnClickPendingIntent(R.id.mainText,widgetPendingIntent); // Tell the widget manager appWidgetManager.updateAppWidget(appWidgetId,remoteView); } }
这是日志文件,从触摸窗口小部件(注意,prefs活动也有一个日志打印输出,并显示小部件ID作为不同的数字,这个):
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) } 05-14 17:15:47.453: V/wotd(1585): In onReceive(),extras is valid 05-14 17:15:47.463: V/wotd(1585): In onReceive(),mAppWidgetId is ok 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中,转到以下行:
PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context,0);
…并将其更改为:
PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context,appWidgetId,0);