Android - Скрыть все показанные сообщения о Toast - программирование
Подтвердить что ты не робот

Android - Скрыть все показанные сообщения о Toast

Как удалить все тосты, отображаемые в настоящее время?

В моем приложении есть список, когда пользователь нажимает на элемент, отображается тост-сообщение, 10 предметов - 10 тостов.

Итак, если пользователь нажимает 10 раз, то нажимает кнопку меню, им приходится ждать несколько секунд, пока они не смогут прочитать текст опции меню.

Это не должно быть так:)

4b9b3361

Ответ 1

Мое решение состояло в том, чтобы инициализировать единый Toast в активности. Затем измените свой текст на каждый клик.

Toast mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
if (a) {
  mToast.setText("This is a");
  mToast.show();
} else if (b) {
  mToast.setText("This is b");
  mToast.show();
}

Ответ 2

как отключить все тосты в настоящее время?

Вы можете отменить индивидуальный Toasts, вызвав cancel() в объекте Toast. AFAIK, вы не можете отменить все выдающиеся Toasts, однако.

Ответ 3

Как проверить, отображается ли тост?

private Toast toast;
...
void showToast() {
   if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
      toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
      toast.show();
   }
}

Ответ 4

Решение Mudar отлично работало для меня по аналогичной проблеме - у меня были разные тосты, складывающиеся в отставание после нескольких кликов button.

Один экземпляр Toast с разными setText()s и show() был именно тем, что я искал - предыдущее сообщение было отменено, как только нажимается новая кнопка. Пятно на

Просто для справки, вот что я сделал...

В OnCreate:

    final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);

Внутри каждого OnClick:

myToast.setText(R.string.toast1);
myToast.show();

Ответ 5

Я думаю, что нашел способ сделать сообщение с тостами не в очереди для меня. Думал, что поделюсь.

эта часть идет вверх.

private Toast msg;    

Эта часть идет в моем setOnTouchListener()

if(null == msg)
{
msg = Toast.makeText("Message to user!", Toast.LENGTH_SHORT);
msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
msg.show();

//handels the stupid queueing toast messages
new Handler().postDelayed(new Runnable()
{
      public void run()
      {
          msg = null;

      }
}, 2000);

}

Это скорее хак, чем что-либо. Но я показываю тост-сообщение в любое время, когда кто-то из фаворитов будет частью моего приложения. И если они сойдут с ума, нажав на любимую кнопку, он сойдет с ума от сообщений с тостами. Но не больше. Он будет ждать 2 секунды, а затем установите для моего тоста объект null и снова отобразит его.

Ответ 6

Мое решение состоит в том, чтобы сохранить все тосты в списке и сделать способ отменить все их, когда это необходимо:

private ArrayList<Toast> msjsToast = new ArrayList<Toast>();

private void killAllToast(){
    for(Toast t:msjsToast){
        if(t!=null) {
            t.cancel();
        }
    }
    msjsToast.clear();
}

Когда вы создаете Toast, сделайте этот путь и сохраните ссылку:

Toast t = Toast.makeText(context, "Download error: xx", Toast.LENGTH_LONG);
t.show();
msjsToast.addToast(t);

Когда вам нужно удалить их:

killAllToast();

Вы можете создать это как статический метод в глобальном классе и использовать его для уничтожения всего тоста приложения.

Ответ 7

Вот как я это делаю.

Toast toast;   

if(toast==null)
        toast=Toast.makeText(getApplicationContext(),R.string.act_now_private_post_text,Toast.LENGTH_LONG);
        else
            toast.setText(R.string.act_now_private_post_text);
        toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL,10,10);
        toast.show();

Ответ 8

Вот мой простой ответ на проблему:

Сначала в вашей деятельности создайте глобальный объект Toast.

    private Toast example;

Теперь, когда вы хотите вызвать новое сообщение Toast, просто выполните следующее:

if(buttonClicked) {
    example.cancel();
    example = Toast.makeText(this, "" , Toast.LENGTH_SHORT);
    example.setText("Button Clicked");
    example.show();
}

Это держит все тосты в одном центральном тосте и удаляет спам Тоста. Это быстрое грубое решение, поэтому, возможно, есть более элегантный способ сделать это.

Ответ 9

mToast=Toast.makeText(this, "", Toast.LENGTH_LONG);
        showToast.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                mToast.cancel();
                String text=null;
                if(ON)
                {
                    text="Toast is on";
                }
                else
                {
                    text="Toast is off";
                }
                mToast.setText(text);
                mToast.setDuration(Toast.LENGTH_SHORT);
                mToast.show();

            }
        });

Ответ 10

Вы можете использовать вот так.

class MyToast {
private static Toast t;

public MyToast(Context ctx, String message) {
    if (t != null) {
        t.cancel();
        t = null;
    }
    t = Toast.makeText(ctx, message, Toast.LENGTH_SHORT);
}

public void show() {
    t.show();
}
}

Ответ 11

Используя превосходный ответ Мадура выше, я распространил это на класс, который будет обрабатывать разные типы сообщений:

public class ToastManager {
    private Toast toastWarningMessage;
    private Toast toastAddMessage;
    ...

    public void messageWarning(Context context, String message) {
        if(toastWarningMessage == null) {
            toastWarningMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
        } else {
            toastWarningMessage.cancel();
            toastWarningMessage.setText(message);
        }
        toastWarningMessage.show();
    }

    public void messageAdd(Context context, String message) {
        if(toastAddMessage == null) {
            toastAddMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
        } else {
            toastAddMessage.cancel();
            toastAddMessage.setText(message);
        }
        toastAddMessage.show();
    }
    ...
}

И это вызвано из моей основной деятельности:

ToastManager toastManager;
...
private void toastWarningMessage(String message) {
    if(toastManager == null) toastManager = new ToastManager();
    toastManager.messageWarning(this, message);
}

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

Когда пользователь спам кнопки, тост будет просто отменять каждый раз для одного и того же типа сообщения. Единственная проблема заключается в том, что пользователь может спамить соединение сообщений. Это приводит к тому, что первое сообщение повторяется, и как только оно окончательно истекает, другие сообщения отображаются один раз. Не очень большая проблема, но что-то, о чем нужно знать.

Я не рассматривал возможные недостатки нескольких экземпляров Toast.

Ответ 12

В моем приложении очередные тосты появляются снова и снова, когда приложение переходит в фоновый режим, поэтому я сделал следующее, чтобы решить проблему.

Добавить код, чтобы обнаружить, когда приложение переходит в фоновый режим. Один из способов зарегистрировать обработчик жизненного цикла. Подробнее... ref

registerActivityLifecycleCallbacks(new MyLifecycleHandler());

App.inBackground = true;, когда приложение переходит в фоновый режим и показывает тост, используя класс SmartToast

public class SmartToast {

    static ArrayList<WeakReference<Toast>> toasts = new ArrayList<>();
    public static void showToast(@NonNull Context context,@NonNull String message){
        //this will not allowed to show toast when app in background
        if(App.inBackground) return;
        Toast toast = Toast.makeText(context,message,Toast.LENGTH_SHORT);
        toasts.add(new WeakReference<>(toast));
        toast.show();

        //clean up WeakReference objects itself
        ArrayList<WeakReference<Toast>> nullToasts = new ArrayList<>();
        for (WeakReference<Toast> weakToast : toasts) {
            if(weakToast.get() == null) nullToasts.add(weakToast);
        }
        toasts.remove(nullToasts);
    }

    public static void cancelAll(){
        for (WeakReference<Toast> weakToast : toasts) {
            if(weakToast.get() != null) weakToast.get().cancel();
        }
        toasts.clear();
    }

}

вызывать метод SmartToast.cancelAll();, когда приложение переходит в фоновый режим, чтобы скрыть текущий и все ожидающие тосты. Код - это весело. Наслаждайтесь!

Ответ 13

Здесь, как отключить сообщения для тостов, удалите выражение show().

//Disable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT); 

//Enable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();