Android - удалить кнопку действия из уведомления
Я хочу удалить кнопки действия уведомления (а не все уведомления) при нажатии на эти кнопки действий. (Скажем: уведомление о загрузке с кнопкой остановки действия. Когда вы нажимаете кнопку "Остановить", отпустите кнопку "Стоп" и измените contentText на "Загрузить отменено" )
Единственное, что приходит мне на ум - это отменить уведомление и уведомить другого с тем же идентификатором, но это кажется уродливым обходным путем...
Итак, есть ли способ удалить кнопки действий из уведомлений?
(я думаю, что нет необходимости вводить какой-либо код, но я буду, если это необходимо...)
Ответы
Ответ 1
Если вы используете NotificationCompat.Builder из библиотеки поддержки v4, вы можете просто получить доступ к сборке действий строителя напрямую (к сожалению, никаких публичных мутаторов не предоставляется).
Следующее выполнит трюк (конечно, вы должны обновить повторное уведомление):
NotificationCompat.Builder notifBuilder = NotificationCompat.Builder(context);
...
notifBuilder.mActions.clear();
Ответ 2
Я использую следующее обходное решение:
NotificationCompat.Builder builder = //existing instance of builder
//...
try {
//Use reflection clean up old actions
Field f = builder.getClass().getDeclaredField("mActions");
f.setAccessible(true);
f.set(builder, new ArrayList<NotificationCompat.Action>());
} catch (NoSuchFieldException e) {
// no field
} catch (IllegalAccessException e) {
// wrong types
}
отсюда: https://code.google.com/p/android/issues/detail?id=68063
Ответ 3
У меня была та же проблема и я нашел решение для этого.
Я создал другой строитель и добавил два "пустых" действия, например:
builder.addAction(0, null, null);
builder.addAction(0, null, null);
(по одной для каждой кнопки у меня было, поэтому, если у вас их три, назовите ее три раза).
Затем при вызове Notify он удаляет кнопки.
Ответ 4
Несмотря на то, что принятый ответ работает, согласно документации, спроектированный способ сделать это - использовать класс NotificationCompat.Extender
. Например, в Котлине:
private val clearActionsNotificationExtender = NotificationCompat.Extender { builder ->
builder.mActions.clear()
builder
}
private val notificationBuilder by lazy {
NotificationCompat.Builder(context)
.addAction(R.drawable.ic_play_arrow, "Play", playPendingIntent)
}
private fun updateNotification(){
notificationBuilder
.extend(clearActionsNotificationExtender) // this will remove the play action
.addAction(R.drawable.ic_pause, "Pause", pausePendingIntent)
}
Ответ 5
NotificationCompat.Builder notifBuilder = NotificationCompat.Builder(context);
удалить кнопку полного действия:
builder.mActions.clear();
для удаления кнопки специального действия:
builder.mActions.remove(index);
в конце концов:
notificationManager.notify(notificationID, builder.build());
Ответ 6
Android предоставляет зону уведомлений для оповещения пользователей о произошедших событиях. Он также предоставляет ящик уведомлений, который пользователь может вывести, чтобы просмотреть более подробную информацию об уведомлении.
Ящик уведомлений состоит из
- Просмотр (содержит мелочь, деталь, маленькую иконку)
- Действие (любое действие, которое может произойти в случае, если пользователь нажимает вид ящика уведомлений)
Чтобы настроить уведомление, чтобы его можно было обновить, введите его с идентификатором уведомления, вызвав NotificationManager.notify(ID, уведомление). Чтобы обновить это уведомление после его выпуска, обновите или создайте объект NotificationCompat.Builder, создайте из него объект Notification и выпустите уведомление с тем же идентификатором, который вы использовали ранее.
mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Sets an ID for the notification, so it can be updated
int notifyID = 1;
mNotifyBuilder = new NotificationCompat.Builder(this)
.setContentTitle("New Message")
.setContentText("You are downloading some image.")
.setSmallIcon(R.drawable.ic_stop)
numMessages = 0;
// Start of a loop that processes data and then notifies the user
...
mNotifyBuilder.setContentText("Download canceled")
.setNumber(++numMessages);
// Because the ID remains unchanged, the existing notification is
// updated.
mNotificationManager.notify(
notifyID,
mNotifyBuilder.build());
...