Почему не срабатывает setOnClickPendingIntent в Android 7.0 Nougat в уведомлении?

Данный код (см. ниже) прекрасно работает в API ниже и выше 24. Не работает только в Android 7.0 Nougat. Вопрос: почему и как исправить?

Создаём custom уведомление:
layout.control_notification.xml
<FrameLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:id="@+id/notify_button"
	android:layout_width="match_parent"
	android:layout_height="match_parent"/>

Вешаем обработчик на клик по области уведомления:
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.control_notification);

Intent actionIntent = new Intent(ACTION_NOTIFICATION_BUTTONS);
remoteViews.setOnClickPendingIntent(R.id.notify_button,
	PendingIntent.getBroadcast(
			this,
			1,
			actionIntent,
			PendingIntent.FLAG_UPDATE_CURRENT
	));

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CONTROL_CHANNEL_ID)
	.setContent(remoteViews)
	.setSmallIcon(R.drawable.ic_notification)
	.setPriority(NotificationCompat.PRIORITY_HIGH);

Выводится уведомление через startForeground. На клики по уведомлению под 7-й не реагирует. Проверял и на телефоне и на эмуляторе.

На stackoverflow есть аналогичный вопрос, но нет решения. Предложенный автором ответ с добавлением в разметку следующего кода, мне никак не помог.
android:focusable="true"
android:clickable="true"
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
VDG
@VDG Автор вопроса
Удалось самому решить проблему.

Баг хорошо виден на эмуляторе, где можно делать любое количество кликов по одной и той же точке. Суть бага в том, что периодически теряются клики в области кастомного уведомления. Находятся такие точки, где можно утыкаться до бесконечности, пока не сместишь мышь. Всё это носит случайный характер.

Похоже, этот баг связан с внутренней оптимизацией, излишней. Если корневой layout пустой, то на него вообще не повесится обработчик клика через setOnClickPendingIntent. Если не пустой, то клики проходят рандомно.

Чтобы убрать баг достаточно добавить в разметку элемент типа Button/ImageButton. Просто добавить, не вешая на него обработчик клика, и тогда нормально заработают клики на все другие элементы, на которые повешен setOnClickPendingIntent.

Пример неработающей разметки, в которой для исправления достаточно раскомментировать ImageButton.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:orientation="horizontal"
	tools:layout_height="64dp">

	<FrameLayout
		android:id="@+id/button_1"
		android:layout_width="wrap_content"
		android:layout_height="match_parent"
		android:layout_weight="1"
		android:background="@color/colorPrimaryDark">

		<ImageView
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:layout_gravity="center"
			android:src="@drawable/ic_notify_1"/>
	</FrameLayout>

	<FrameLayout
		android:id="@+id/button_2"
		android:layout_width="wrap_content"
		android:layout_height="match_parent"
		android:layout_weight="1"
		android:background="@color/colorPrimaryDark">

		<ImageView
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:layout_gravity="center"
			android:src="@drawable/ic_notify_2"/>

		<!--<ImageButton
			android:layout_width="64dp"
			android:layout_height="64dp"
			android:layout_gravity="center"
			android:layout_margin="0dp"
			android:padding="0dp"
			android:src="@drawable/ic_notify_2"/>-->
	</FrameLayout>
</LinearLayout>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы