Виджет 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.

Другие вопросы по тегам