Виджет 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);
    }
}

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

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 неверен.

Есть идеи, почему это происходит? Большое спасибо!

 Sandy19 мая 2012 г., 21:16
Я не понимаю ваш комментарий. Вы можете перефразировать?
 Sandy14 мая 2012 г., 23:28
Да, я хочу, чтобы случайное число менялось при каждом касании виджета.
 ρяσѕρєя K14 мая 2012 г., 19:38
В чем проблема, вы хотите обновить свой виджет на виджет Cick или что-то другое?
 Ronnie19 мая 2012 г., 15:30
Вы уверены, что у вас нет двух копий одного и того же кода с небольшой разницей?

Ответы на вопрос(3)

истрировать пользовательский приемник вещания в Manifest и добавить его в качестве действия с виджетом как

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

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

Step 2: В вашем классе виджетов 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);
            }
    }

STEP 3: В вашем updateWidgetState добавьте новое действие в 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);

Finally you can Download Working HomeWidget Example from HERE  HomeWidgetRendomNumber Который генерирует случайное число при каждом клике.

updateAppWidget перейти к этой строке:

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

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

PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, appWidgetId, widgetIntent, 0);
 20 мая 2014 г., 16:11
В этом нет волшебства, просто PendingIntents должен быть уникальным по своему дизайну. Идентификаторы виджетов, используемые в качестве кодов запросов, помогают отличить один экземпляр от другого
 23 янв. 2013 г., 02:18
В javadocs прямо указано, что второй параметр (код запроса) не используется.
 19 сент. 2013 г., 13:57
Оно работает! Не знаю почему. Кто-нибудь может объяснить, что за магия происходит в этой строке?

PendingIntent.FLAG_UPDATE_CURRENT

Ваш ответ на вопрос