2010-05-02 3 views
47

Как удалить все тосты, отображаемые в настоящее время?Android - Скрыть все показанные сообщения Toast

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

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

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

+0

Возможный дубликат [Android отменить тост при выходе из приложения и при показе тоста] (http://stackoverflow.com/questions/16098151/android-cancel-toast-when-exiting-the-app-and- когда-тост-бытие-показано) –

ответ

29

как отключить все существо процесса тостов сообщения в настоящее время?

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

+0

хм, спасибо большое, попытается что-то создать. , но если я добавлю все тосты к какой-то структуре ... есть возможность проверить, какие из них были показаны, а какие нет. Я занят тем временем ... стараюсь просить и не пытаться, по крайней мере, я отвечу, пытаясь что-то построить (самое позднее) в конце недели. -thanks! - – crazyV

+8

Это мой последний пейджер для Android: нет возможности отменить все поставленные в очередь тосты. –

+2

Какое разочарование: если вы отмените текущий тост, последующие тосты будут отображаться только после того времени, когда этот тост собирался показать. –

76

Мое решение состояло в том, чтобы инициализировать единый 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

спасибо за ваш ответ, CommonsWare выше уже объяснил, чтобы отключить список сообщений с тостами в очереди ... :) thx, но sry .. я думаю, что вы неправильно поняли вопрос! – cV2

+2

Хотя это хороший ответ, на самом деле это не то же самое поведение. С помощью этого решения вы никогда не сможете увидеть два тоста, которые показывают друг за другом. –

7

решение Мудар работала прекрасно для меня на подобной проблемой - у меня были различные тостов укладки в накопившихся после нескольких button кликов.

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

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

В OnCreate:

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

В каждой OnClick:

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

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

0
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(); 

      } 
     }); 
+0

Это в основном то же, что и ответ Мудара. –

-10

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

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

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

Это не отключает их, что их просто никогда не показывает. Не то же самое! –

+1

это смешно, хотя – Machado

3

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

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

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 и снова отобразит его.

+1

Ваше решение Handler.postDelayed интересно, +1 для этого. –

10

Что касается проверки того, что тост уже отображается?

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

Это работало лучше для меня, так как у меня была пара слайдеров, каждая из которых могла генерировать несколько тостов в секунду, когда пользователь играл с ними. Благодарим за ваш вклад. – pete

1

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

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(); 
0

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

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(); 
} 
} 
+2

Добро пожаловать в SO & Thanks для обмена. Попытайтесь добавить некоторый описательный текст в свой код только ответ. [«Как написать хороший ответ?»] (Http://stackoverflow.com/help/how-to-answer). _Brevity допустимо, но более полные объяснения лучше. –

0

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

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.

3

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

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(); 

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

1

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

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

private Toast example; 

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

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

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

0

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

Добавить код для определения того, когда приложение переходит в фоновый режим. Один из способов зарегистрировать обработчик жизненного цикла.Для более подробной информации 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(); метода, когда приложение переходит в фоновый режим, чтобы скрыть текущие и все ожидающие тосты. Код - это весело. Наслаждайтесь!

Смежные вопросы