AlertDialogs показать / отклонить один за другим - PullRequest
0 голосов
/ 25 августа 2018

У меня есть список сообщений и время, когда я хочу показать их с AlertDialog;alertDialog должен завершиться после истечения времени, и следующий диалог должен быть показан до конца списка

Структура модели AlertList: (int time, String message, логическое отмена)

AlertList a0 = new AlertList(5, "11111111111", false);
AlertList a1 = new AlertList(2, "222222222", true);
AlertList a2 = new AlertList(2, "3333333333333", false);
AlertList a3 = new AlertList(2, "4444444444444444444444", true);

List<AlertList> list = new ArrayList<>();
list.add(a0);
list.add(a1);
list.add(a2);
list.add(a3);

Я хочу показать alertDialog после завершения другого alertDialog

        if (list != null && list.size() > 0) {

            for (int i = 0; i < list.size(); i++) {
//                synchronized (this) {

                int finalI = i;
                AlertDialog dialog = new AlertDialog.Builder(context).create();
                new Handler().post(() -> {
                    dialog.setMessage(list.get(finalI).getStrComment());
                    dialog.setCancelable(false);
                    dialog.setCanceledOnTouchOutside(false);
                    if (list.get(finalI).isCancelable()) {
                        dialog.setCancelable(true);
                        dialog.setCanceledOnTouchOutside(true);
//                        } else {
                    }

                    dialog.show();

                    new Handler().postDelayed(() -> {
                        dialog.dismiss();
//                            resume();
                    }, list.get(finalI).getTime() * 1000);
                    dialog.setOnDismissListener(dialog1 -> notify());
                });
                try {
                    Thread.sleep(list.get(finalI).getTime() * 1000 + 500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
//                    if (!paused)
//                        pause(finalI);
//                    notify();
//                }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Вы не должны использовать какой-либо цикл (цикл for) в этом случае, потому что он создает весь диалог синхронно, вместо этого вам нужно открыть следующий диалог, когда вы уведомите, что предыдущий диалог (или действие) выполнен.

В этом сценарии вы можете получать уведомления либо по setOnDismissListener, либо когда пользователь предпринимает какое-либо действие, такое как нажатие кнопки, здесь рекурсивный вызов функции может помочь вам выполнить то, что вы хотите сделать

private void showDialogs(List<AlertList> list) {
    if (list == null || list.size() == 0) return;

    AlertList data = list.get(0);
    list.remove(0);

    AlertDialog dialog = new AlertDialog.Builder(context)
            .setMessage(data.getStrComment())
            .setCancelable(data.isCancelable())
            .create();
    dialog.setCanceledOnTouchOutside(data.isCancelable());

    CountDownTimer timer = new CountDownTimer(data.getTime() * 1000, data.getTime() * 1000) {

        @Override
        public void onTick(long millisUntilFinished) { }

        @Override
        public void onFinish() {
            dialog.dismiss(); 
        }
    };

    dialog.setOnDismissListener(dialog1 -> {
        timer.cancel();
        showDialogs(list);
    });

    dialog.show();
    timer.start();
}

А затем вам нужно вызвать метод showDialogs один раз, например, в методе onCreate.

0 голосов
/ 25 августа 2018
    List<AlertList> list = new ArrayList<>();
    list.add(a0);
    list.add(a1);
    list.add(a2);
    list.add(a3);

    List<Dialog> dialogs = new ArrayList<>();
    for (AlertList item : list) {
        AlertDialog alertDialog = new AlertDialog.Builder(this)
                .setMessage(item.getStrComment())
                .setOnDismissListener(dialog -> {
                    if (!dialogs.isEmpty()) {
                        //checking if dialogs list not empty then will remove the top item
                        dialogs.remove(0);

                        //and dismiss the current dialog after your handler logic
                        dialog.dismiss();

                        //then showing then next dialog from the list
                        if (!dialogs.isEmpty())
                            dialogs.get(0).show();
                    }
                }).create();
        dialogs.add(alertDialog);
    }
    // the command to start showing dialogs
    dialogs.get(0).show();
...