Виджет Android: PendingIntent для ListView не вызывается с помощью setPendingIntentTemplate и setOnClickFillInIntent
Пробовал разные подходы для реализации события onClick для ListView в моем виджете, но безрезультатно.
Мой виджет определен в AndroidManifest.xml:
<!-- Widget -->
<receiver android:name=".widget.AppWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/app_widget_info"/>
</receiver>
<service android:exported="false" android:name=".widget.AppWidgetService" android:permission="android.permission.BIND_REMOTEVIEWS"/>
Мой первый подход состоял в том, чтобы использовать onReceive для получения намерения и начать другое действие:
// setPendingIntentTemplate in AppWidgetProvider
final Intent onClickIntent = new Intent(context, AppWidgetProvider.class);
onClickIntent.setAction(AppWidgetProvider.CLICK_ACTION);
onClickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
onClickIntent.setData(Uri.parse(onClickIntent.toUri(Intent.URI_INTENT_SCHEME)));
final PendingIntent onClickPendingIntent = PendingIntent.getBroadcast(context, 0,
onClickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
rv.setPendingIntentTemplate(R.id.widget_schedule_list, onClickPendingIntent);
// and setOnClickFillInIntent in the getViewAt() in RemoteViewsService.RemoteViewsFactory class
final Bundle extras = new Bundle();
final Intent fillInIntent = new Intent();
extras.putInt(TVTracWidgetProvider.EXTRA_ITEM, position);
fillInIntent.putExtras(extras);
rv.setOnClickFillInIntent(R.id.episode_schedule_widget_row, fillInIntent);
Мой второй подход состоял в том, чтобы начать деятельность напрямую:
// setPendingIntentTemplate in AppWidgetProvider
TaskStackBuilder builder = TaskStackBuilder.create(context)
.addNextIntent(new Intent(context, MainActivity_.class));
builder.addNextIntent(new Intent(context, EpisodeActivity_.class));
rv.setPendingIntentTemplate(R.id.widget_schedule_list, builder.getPendingIntent(1, PendingIntent.FLAG_UPDATE_CURRENT));
// and setOnClickFillInIntent in RemoteViewsFactory getViewAt()
Bundle extras = new Bundle();
extras.putInt(EpisodeActivity.showIdExtra, episode.getShow().getId());
extras.putInt(EpisodeActivity.seasonNrExtra, episode.getSeasonNr());
extras.putInt(EpisodeActivity.episodeNrExtra, episode.getEpisodeNr());
Intent fillInIntent = new Intent();
fillInIntent.putExtras(extras);
rv.setOnClickFillInIntent(R.id.episode_schedule_widget_row, fillInIntent);
Однако ни один из подходов не работает. PendingIntentTemplate находится в идентификаторе ListView, а onClickFillInIntent - в родительском макете каждого элемента строки. Может ли кто-нибудь объяснить мне, что может привести к тому, что щелчок не будет запущен? Заранее спасибо!
Источники: WeatherlistWidget и App Widgets
2 ответа
Проблема заключалась в TextViews внутри элемента, который имел textIsSelectable="true".
Для нового поколения разработчиков AppWidget.
Аксиома, полученная из недавно обновленного кода API виджетов:
Если в основеsetPendingIntentTemplate()
ожидающее намерение объявляется с новым обязательным флагомPendingIntent.FLAG_IMMUTABLE
то любые изменения, ожидаемые отsetOnClickFillInIntent()
суперпозиция игнорируется.
Т.е. изменить его на MUTABLE.