Как сделать так, чтобы тост находился на экране в течение определенного времени, прежде чем другой тост заменит его? - PullRequest
1 голос
/ 25 мая 2019

Я только начал изучать Android.Для отладки я использую свое устройство MIUI 10.

Я изучил самую базовую программу жизненного цикла приложения.Проблема в том, что я использую тосты, чтобы показать, когда вызывается каждый из методов.Например: когда я нажимаю кнопку «Назад», onPause, onStop и onDestroy - это 3 отдельных тоста, которые будут отображаться.

Проблема, с которой я сталкиваюсь, заключается в том, что MIUI автоматически отменяет текущий тост, если вызывается другой.Таким образом, я получаю только отображение тостов onDestroy.

Есть ли способ обеспечить вывод тоста на экран в течение заданного промежутка времени до следующего?Это не должно относиться только к этому сценарию.Мне нужно общее решение, которое поможет и в будущем.

1 Ответ

1 голос
/ 25 мая 2019

Если версия MIUI для Android изменила поведение по умолчанию, когда тосты отображаются последовательно, вы всегда можете опубликовать их с задержкой самостоятельно. Стандартный период задержки для длинного тоста составляет 3500 мс, а для короткого тоста - 2000 мс. Имея это в виду, вы можете попробовать что-то вроде этого (не проверено):

final Handler uiHandler = new Handler(Looper.getMainLooper());

void scheduleToasts(String... messages) {
    final List<String> list = Arrays.asList(messages);
    Collections.reverse(list);

    final AtomicInteger countdown = new AtomicInteger(list.size());
    final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

    service.scheduleWithFixedDelay(() -> {
        final int count = countdown.getAndDecrement();
        if(count == 0) {
            service.shutdown();
            return;
        }

        uiHandler.post(() -> Toast.makeText(getContext(), list.get(count), Toast.LENGTH_LONG).show());
    }, 0, 3500, TimeUnit.MILLISECONDS);
}

При использовании:

scheduleToasts("message1", "message2", "message3");
...