Я использую общий "myToast", который я использую "myToast.cancel(), перед выпуском нового тоста. Для Android v2.3 и старше это отлично работает. Когда нужно отправить новый тост, старый, если он все еще отображается на экране, отменяется (и сразу исчезает), чтобы быть замененным новым тостом. Это позволяет избежать сложения кучи тостов, если пользователь нажимает клавишу несколько раз, для которой требуется предупреждение (и другие условия). Мой фактический случай - это один тост, когда нажимается неправильная клавиша, а другая появляется, если кнопка" Сброс" не нажата.
Для Android 4.0 и 4.1 выдача myToast.cancel() перед очередным тостом убивает как текущий, так и следующий тосты. Текущий API отмены() указывает, что он отменяет текущий И следующий тост (что кажется довольно глупым). Зачем отменять тост, который вы хотите мириться?
Любые идеи об отмене работают последовательно в версиях Android (и как это работает в версии 2.3 и старше)?
Я попробую немного неэлегантную двойную систему тоста с отслеживанием, для которой используется тост, но, похоже, такая боль работает вокруг этого плохого поведения в 4.x, чтобы получить то, что отлично работает и логично в старых версиях Android.
Хорошо, я решил это, но это не так чисто, как хотелось бы. Я реализовал двойной подход к тосту, где он чередуется между двумя тостами. Сначала мы определяем тосты для активности до OnCreate:
Toast toast0;
Toast toast1;
private static boolean lastToast0 = true;
В OnCreate:
toast0 = new Toast(getApplicationContext());
toast0.cancel();
toast1 = new Toast(getApplicationContext());
toast1.cancel();
И, наконец, когда мне нужно отобразить тост и отменить предыдущий тост, в то же время я использую нечто похожее на:
if (lastToast0) {
toast0.cancel();
toast1.setDuration(Toast.LENGTH_LONG);
toast1.setText("new message");
toast1.show();
lastToast0 = false;
} else {
toast1.cancel();
toast0.setDuration(Toast.LENGTH_LONG);
toast0.setText("new message");
toast0.show();
lastToast0 = true;
}
Если вам нужно просто отменить существующий тост (перед его истечением), используйте:
toast0.cancel();
toast1.cancel();
Протестировано на Nexus 7 (4.1), эмулятор 4.0 и несколько устройств с Android 2.2, 2.3.