Android-виджет не обновляется – имеет неправильный идентификатор виджетов

Я работаю над виджетами и делаю некоторые успехи (надеюсь), но все равно не могу заставить его делать то, что я хочу.

У меня есть работа с конфигуратором, которая работает нормально. Когда он закрывается, я вызываю метод updateAppWidget в классе WordWidget, и виджет обновляет случайное число.

То, что я не могу сделать, заставляет случайное число меняться из-за onClick. Согласно журналу я делаю метод onReceive (), но об этом.

В журнале я печатаю идентификатор виджета. Я заметил, что при запуске из активности конфигуратора он печатает 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", "In onReceive(), mAppWidgetId is ok"); updateAppWidget(context, appWidgetManager, mAppWidgetId); } } else { Log.v("wotd", "In onReceive(), extras is INVALID"); mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; } } } static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 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, 0, 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); } } 

Это файл журнала, начиная с того момента, когда я касаюсь виджета (обратите внимание, что активность префикса также имеет распечатку журнала и показывает идентификатор виджета как другой номер, что это):

 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, widgetIntent, 0); 

… и изменить его на:

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

Обновление виджета «Домашний экран» на сенсорном экране Вам необходимо зарегистрировать собственный приемник вещания в манифесте и добавить его как действие с виджетами как:

Шаг 1: зарегистрируйте пользовательский приемник как:

 <intent-filter> <action android:name="com.imrankhanandroid.HomeWidgetRandomNum.ACTION_WIDGET_RANDOM"/> </intent-filter> 

Шаг 2. В вашем классе Widget AddAction в макет как:

 public void onReceive(Context paramContext, Intent paramIntent) { //Intent String str = paramIntent.getAction(); if (paramIntent.getAction().equals(ACTION_WIDGET_RANDOM)) { updateWidgetState(paramContext, str); } else { super.onReceive(paramContext, paramIntent); } } 

ШАГ 3: В вашем обновленииWidgetState добавьте новое действие в Intent как:

 rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layoutmain); Intent active = new Intent(paramContext, Randomnuberwidget.class); active.setAction(ACTION_WIDGET_RANDOM); PendingIntent actionPendingIntent = PendingIntent.getBroadcast(paramContext, 0, active, 0); rview.setOnClickPendingIntent(R.id.ImageView_gps, actionPendingIntent); 

Наконец, вы можете загрузить рабочий пример HomeWidget из ЗДЕСЬ HomeWidgetRendomNumber, который создает случайный номер на каждом клике .

Вам нужно установить последний флаг в getBroadcast: PendingIntent.FLAG_UPDATE_CURRENT