Как я могу обновить пользовательский интерфейс для виджета приложения для Android

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

Я установил функцию onUpdate() WidgetProvider, чтобы зарегистрировать ожидающее событие для кнопки, чтобы она запускала службу для увеличения счетчика:

Intent active = new Intent(context, CounterService.class);
active.setAction(CounterService.COUNT);
PendingIntent pending = PendingIntent.getService(context, 0, active, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.CountButton, pending);

ComponentName component = new ComponentName(context.getPackageName(), KickCounterWidgetProvider.class.getName());    
appWidgetManager.updateAppWidget(component, views);

Затем в сервисной функции CounterService::onStart() я увеличиваю счетчик (пока что хранится в префах), а затем пытаюсь обновить текстовое поле, которое показывает текущее значение счетчика:

// ... bump the count here and store a string representation of it in currentCountString ...

RemoteViews remoteView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget);

remoteView.setTextViewText(R.id.CurrentKickCount, currentCountString);

// apply changes to widget
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName component = new ComponentName(getApplicationContext().getPackageName(), KickCounterWidgetProvider.class.getName());    
appWidgetManager.updateAppWidget(component, remoteView);

Разумное использование Logcat показывает, что все это работает нормально, и строка кажется в порядке, но по какой-то причине вызов appWidgetManager.updateAppWidget() по какой-то причине, похоже, не работает.

Я не знаю, связано ли это вообще, но в первый раз, когда я добавляю экземпляр виджета на рабочий стол, даже кнопка не работает (т.е. вызов updateAppWidget() в onUpdate() в провайдере не работает). Последующие экземпляры виджета, кажется, работают нормально для вызова updateAppWidget() в Provider, но никогда не работают для службы.

Любая помощь будет принята с благодарностью.


person Stevil Knevil    schedule 16.11.2010    source источник


Ответы (2)


Откуда: http://code.google.com/p/android/issues/detail?id=8889

При установке виджета на только что очищенный или вновь созданный AVD вызовы appWidgetManager.updateAppWidget не обновляют соответствующие
виджеты. Намерения принимаются правильно, вызовы вызываются нормально, но обновлений виджета не происходит.

Если вы перезапустите AVD (с пакетом виджета, установленным на устройстве или без него), проблема перестанет существовать после первой загрузки без свежей инициализации.

Проблема, кажется, существует на 2.0 и 2.1, на 1.5, 1.6 и 2.2 она ведет себя так, как ожидалось.

person Stevil Knevil    schedule 17.11.2010

Ваш общий подход кажется разумным, хотя this, вероятно, работает здесь так же хорошо, как getApplicationContext(). Однако ваш последний полный абзац предполагает, что что-то еще может быть не так. Вот несколько сложный пример проекта, который демонстрирует своего рода шаблон, который вы используете — в данном случае случайный выбор ресторана, а не натыкание на прилавок.

person CommonsWare    schedule 16.11.2010
comment
Ааа, интересно, я проверю это. Кстати, все это я начал с github.com/commonsguy/cw -advandroid/tree/master/AppWidget/ ;-) - person Stevil Knevil; 17.11.2010
comment
@Stevil Knevil: Да, это менее сложный образец. Вариант из Учебники по программированию для Android более близок к тому, что вы пытаетесь настроить. - person CommonsWare; 17.11.2010
comment
Это действительно странно, я переделал его на основе этого примера и получил гораздо более аккуратный код! Но увы без улучшений. По какой-то причине вызов mgr.updateAppWidget(me, updateViews); не работает. Это похоже на обновление виджета, но не принудительное перерисовку экземпляров, поэтому создание новых экземпляров имеет обновленный пользовательский интерфейс, но после создания они не меняются. - person Stevil Knevil; 18.11.2010