Мое приложение создает много тостов во многих местах, вызывая
Toast.makeText(getBaseContext(), "Blah", Toast.LENGTH_SHORT).show();
(хорошо, я использую идентификатор ресурса, а не строку).Все отлично работает на всех версиях Android от 4 до 7, которые я когда-либо использовал, но с Android 8.1.0, если второй всплывающий тост появляется до исчезновения первого, первый восстанавливается при исчезновении второго.Я предполагаю, что менеджер дисплея запоминает пиксели под тостом и восстанавливает их, когда тост уходит, но он недостаточно умен, чтобы справиться со стопкой тостов, поэтому второй «запоминает» изображение первого,и восстанавливает его вместо основной области окна.
Я могу обойти эту проблему, используя оболочку «makeToast», которая каждый раз помещает объект Toast в статическую переменную и вызывает .cancel()
для старой перед .show()
новый.Это окончательное решение или есть лучший путь?
private static Toast lastToast;
private static Context toastContext; // set in onCreate
public static void makeToast(int resId, int duration) {
if (lastToast != null) lastToast.cancel();
lastToast = Toast.makeText(toastContext, resId, duration);
lastToast.show();
}