问题
I have a problem with toasts. For API 26 and below toasts are displayed properly (next toast is waiting for previous to disappear) but on Android 8.1 (API 27) they are covering each other. I have notification channel set up like this:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID,
NOTIFICATION_CHANNEL_NAME,
NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(notificationChannel);
builder.setChannelId(NOTIFICATION_CHANNEL_ID);
}
This fixes toasts on 8.0 for me, but on 8.1 they are still overlapping
Is there any way to fix this instead of remembering last used toast and canceling it manually?
Edit:
Workaround from this thread doesn't work
/**
* <strong>public void showAToast (String st)</strong></br>
* this little method displays a toast on the screen.</br>
* it checks if a toast is currently visible</br>
* if so </br>
* ... it "sets" the new text</br>
* else</br>
* ... it "makes" the new text</br>
* and "shows" either or
* @param st the string to be toasted
*/
public void showAToast (String st){ //"Toast toast" is declared in the class
try{ toast.getView().isShown(); // true if visible
toast.setText(st);
} catch (Exception e) { // invisible if exception
toast = Toast.makeText(theContext, st, toastDuration);
}
toast.show(); //finally display it
}
toasts still overllaping
Edit 2: I've created story for this bug on Android Issue Tracker: link
回答1:
private static final int TIME_DELAY = 4000;
private static long lastToastShowTime = 0;
showToast(final String msg, final Context ctx){
final long pastTime = System.currentTimeMillis() - lastToastShowTime;
if(pastTime > TIME_DELAY ){
Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
lastToastShowTime = System.currentTimeMillis();
}else{
final long delay = TIME_DELAY - pastTime;
lastToastShowTime = System.currentTimeMillis() + delay;
postDelayed(new Runnable(
@Override
public void run() {
try{
Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
catch(Exception e){
Log.e("TOAST_NOT_SHOWED", "Toast not showed: " + msg, e);
}
}
), delay);
}
}
来源:https://stackoverflow.com/questions/50062913/toasts-overlap-issue-on-oreo-8-1