Как отменить изменения в AlertDialog.Builder?

201
29 июня 2022, 07:30

Создаю диалоговое окно с множественным выбором. Подскажите, как правильно отменить изменения выбора после нажатия на кнопку Отмена или закрытия окна? Первое, что приходит в голову - записывать все изменения в массив, а потом подгружать их в зависимости от действий пользователя (нажатие на ок или отмену). Есть ли какой-то более удобный способ?

private void showEventParticipantsDialog()
{
    String[] listItems = new String[] {"Музыкант", "Музыкальная группа", "Фотограф", "Видеограф", "Фокусник",
            "Ведущий", "Шоу", "Диджей", "Звукорежиссёр", "Декоратор"};
    AlertDialog.Builder checkBuilder = new AlertDialog.Builder(getActivity());
    checkBuilder.setTitle("Выберите участников");
    checkBuilder.setMultiChoiceItems(listItems, participantsArray, (dialogInterface, i, b) ->
            participantsArray[i] = b);
    checkBuilder.setPositiveButton("Ок", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i)
        {
        }
    });
    checkBuilder.setNegativeButton("Отмена", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i)
        {
            Log.d("SAHJASSA", "Cancel: ");
        }
    });
    checkBuilder.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialogInterface)
        {
            Log.d("SAHJASSA", "onDismiss: ");
        }
    });
    checkBuilder.create();
    checkBuilder.show();
}
Answer 1

Можно не трогать массив при кликах по элементам, а применить всё разом при позитивном клике.
Соответственно никакие изменения не будут применены если диалог закрыли любым другим способом:

checkBuilder.setPositiveButton("Ок", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        SparseBooleanArray cip = ((AlertDialog) dialog).getListView().getCheckedItemPositions();
        for (int i = 0; i < cip.size(); i++) {
            int key = cip.keyAt(i);
            participantsArray[key] = cip.get(key);
        }    
    }
});

P.S. Чтобы диалог не изменял входной массив нужно передать null вместо обработчика клика по элементу. Странно что это работает именно так, а не наоборот - но что имеем, то имеем:

checkBuilder.setMultiChoiceItems(listItems, participantsArray, null);
READ ALSO
Что такое SPI (Интерфейс поставщика услуг)?

Что такое SPI (Интерфейс поставщика услуг)?

Разбирал документацию Spring, нашёл там термин SPIЧто он означает и какое у него отличие от API? Очень желательно с примерами на Java

192
маршрут для робота

маршрут для робота

я делаю игру на java в виде 2д бродилки с видом сверху и также в моей игре есть робот надо запрограммировать робота так чтобы он обходил все преграды...

220
Существует два абзаца, требуется сравнить, вывести список одинаковых слов после сравнения и предложения задом наперед [закрыт]

Существует два абзаца, требуется сравнить, вывести список одинаковых слов после сравнения и предложения задом наперед [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

137