2012-04-09 1 views
22

В моем приложении я создаю виджет календаря для своей активности, когда я прокручиваю его до предыдущего или следующего месяца, я позволяю ему делать тост и показывать его.Можно ли отменить предыдущий Toast, когда я хочу показать другой Toast?

Вопрос в том, что для тоста нужно время, чтобы показать, когда я прокрутил его достаточно быстро, например, прокрутил до «2012/05» и «2012/06» и прокрутил до «2012/07» без паузы, Я должен ждать Тоста из «2012/05», «2012/06», «2012/07», чтобы показывать по одному медленно.

Похоже андроид имеет невидимую очередь для управления тостов

как я могу очистить его и показывают только последний тост? Могу ли я показать Toast сразу уточнять при не дожидаясь?

Я искал «android.widget.Toast.java» и нашел способ «отменить()», но, к сожалению, доза не работает, как следует.

if (t != null) { 
    t.cancel(); 
} 
t = Toast.makeText(this.mContext, mHelper.getYear() + "年" 
       + (mHelper.getMonth() + 1) + "月", Toast.LENGTH_SHORT); 
t.show(); 
+1

Я пытался понять это, но если честно, я понятия не имею, почему это не работает. ваш код должен работать, если cancel() сделал то, что он говорит. возможно, вам придется использовать что-то другое вместо тостов. – Joe

+0

@topxebec ваш код должен работать. Он составляет основу моей справки класса «Boast» в ответе ниже http://stackoverflow.com/a/16103514/383414 –

ответ

7

Вам необходимо вызвать метод для правильного объекта.

toastObject.cancel() 
5

Вот код.

final Toast toastobject = Toast.makeText(context, "This message will disappear when toast.close(); is called", Toast.LENGTH_SHORT); 

Теперь вы можете использовать объект toastobject. Его Reference

toastobject.cancel(); 

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

+0

Есть ли у Тоста метод, называемый close()? – JonA

+0

Да, я дал ссылку так. – Bhavin

+0

Спасибо, но в Тосте нет доступного метода «close()», есть только «cancel()», ведьма, которую я пробовал (по моему вопросу выше), и доза не работает в моей программе. – topxebec

1

Toast есть метод, чтобы скрыть текущее сообщение Тост

public void cancel() { 
    mTN.hide(); 
} 

Try вызова t.cancel(), когда это необходимо.

+1

Я попробовал, но кажется, что доза не работает ... – topxebec

+1

@JonA - Да, точно. @topxebec - трюк заключается в том, чтобы сохранить этот экземпляр оригинального тоста - 'mTN'. Это то, что улавливает много людей. Вы не можете просто создать новый «Toast» и попытаться его отменить - вам нужно отменить оригинал. –

20

Вот мой ответ скопировал из другого подобного вопроса здесь:

Boast класса выполняет именно то, что вам нужно. Самый последний код можно найти на GitHub здесь:


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

Что я сделал, это создать обертку Toast, содержащую статическую ссылку на последний тост.

Когда мне нужно показать новый, я сначала отменил статическую ссылку, прежде чем показывать новую (и сохранить ее в статическом режиме).

Вот полный код обертки Boast, которую я сделал, - она ​​имитирует методы Тоста для меня, чтобы использовать ее.По умолчанию Boast отменит предыдущий, поэтому вы не создадите очередь ожидающих показов Тостов.

Если вы просто хотите узнать, как отменить уведомления при выходе из приложения, вы найдете там много помощи.


package mobi.glowworm.lib.ui.widget; 

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.content.res.Resources; 
import android.support.annotation.Nullable; 
import android.widget.Toast; 

import java.lang.ref.WeakReference; 

/** 
* {@link Toast} decorator allowing for easy cancellation of notifications. Use this class if you 
* want subsequent Toast notifications to overwrite current ones. </p> 
* <p/> 
* By default, a current {@link Boast} notification will be cancelled by a subsequent notification. 
* This default behaviour can be changed by calling certain methods like {@link #show(boolean)}. 
*/ 
public class Boast { 
    /** 
    * Keeps track of certain Boast notifications that may need to be cancelled. This functionality 
    * is only offered by some of the methods in this class. 
    * <p> 
    * Uses a {@link WeakReference} to avoid leaking the activity context used to show the original {@link Toast}. 
    */ 
    @Nullable 
    private volatile static WeakReference<Boast> weakBoast = null; 

    @Nullable 
    private static Boast getGlobalBoast() { 
     if (weakBoast == null) { 
      return null; 
     } 

     return weakBoast.get(); 
    } 

    private static void setGlobalBoast(@Nullable Boast globalBoast) { 
     Boast.weakBoast = new WeakReference<>(globalBoast); 
    } 


    // //////////////////////////////////////////////////////////////////////////////////////////////////////// 

    /** 
    * Internal reference to the {@link Toast} object that will be displayed. 
    */ 
    private Toast internalToast; 

    // //////////////////////////////////////////////////////////////////////////////////////////////////////// 

    /** 
    * Private constructor creates a new {@link Boast} from a given {@link Toast}. 
    * 
    * @throws NullPointerException if the parameter is <code>null</code>. 
    */ 
    private Boast(Toast toast) { 
     // null check 
     if (toast == null) { 
      throw new NullPointerException("Boast.Boast(Toast) requires a non-null parameter."); 
     } 

     internalToast = toast; 
    } 

    // //////////////////////////////////////////////////////////////////////////////////////////////////////// 

    /** 
    * Make a standard {@link Boast} that just contains a text view. 
    * 
    * @param context The context to use. Usually your {@link android.app.Application} or 
    *     {@link android.app.Activity} object. 
    * @param text  The text to show. Can be formatted text. 
    * @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or 
    *     {@link Toast#LENGTH_LONG} 
    */ 
    @SuppressLint("ShowToast") 
    public static Boast makeText(Context context, CharSequence text, int duration) { 
     return new Boast(Toast.makeText(context, text, duration)); 
    } 

    /** 
    * Make a standard {@link Boast} that just contains a text view with the text from a resource. 
    * 
    * @param context The context to use. Usually your {@link android.app.Application} or 
    *     {@link android.app.Activity} object. 
    * @param resId The resource id of the string resource to use. Can be formatted text. 
    * @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or 
    *     {@link Toast#LENGTH_LONG} 
    * @throws Resources.NotFoundException if the resource can't be found. 
    */ 
    @SuppressLint("ShowToast") 
    public static Boast makeText(Context context, int resId, int duration) 
      throws Resources.NotFoundException { 
     return new Boast(Toast.makeText(context, resId, duration)); 
    } 

    /** 
    * Make a standard {@link Boast} that just contains a text view. Duration defaults to 
    * {@link Toast#LENGTH_SHORT}. 
    * 
    * @param context The context to use. Usually your {@link android.app.Application} or 
    *    {@link android.app.Activity} object. 
    * @param text The text to show. Can be formatted text. 
    */ 
    @SuppressLint("ShowToast") 
    public static Boast makeText(Context context, CharSequence text) { 
     return new Boast(Toast.makeText(context, text, Toast.LENGTH_SHORT)); 
    } 

    /** 
    * Make a standard {@link Boast} that just contains a text view with the text from a resource. 
    * Duration defaults to {@link Toast#LENGTH_SHORT}. 
    * 
    * @param context The context to use. Usually your {@link android.app.Application} or 
    *    {@link android.app.Activity} object. 
    * @param resId The resource id of the string resource to use. Can be formatted text. 
    * @throws Resources.NotFoundException if the resource can't be found. 
    */ 
    @SuppressLint("ShowToast") 
    public static Boast makeText(Context context, int resId) throws Resources.NotFoundException { 
     return new Boast(Toast.makeText(context, resId, Toast.LENGTH_SHORT)); 
    } 

    // //////////////////////////////////////////////////////////////////////////////////////////////////////// 

    /** 
    * Show a standard {@link Boast} that just contains a text view. 
    * 
    * @param context The context to use. Usually your {@link android.app.Application} or 
    *     {@link android.app.Activity} object. 
    * @param text  The text to show. Can be formatted text. 
    * @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or 
    *     {@link Toast#LENGTH_LONG} 
    */ 
    public static void showText(Context context, CharSequence text, int duration) { 
     Boast.makeText(context, text, duration).show(); 
    } 

    /** 
    * Show a standard {@link Boast} that just contains a text view with the text from a resource. 
    * 
    * @param context The context to use. Usually your {@link android.app.Application} or 
    *     {@link android.app.Activity} object. 
    * @param resId The resource id of the string resource to use. Can be formatted text. 
    * @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or 
    *     {@link Toast#LENGTH_LONG} 
    * @throws Resources.NotFoundException if the resource can't be found. 
    */ 
    public static void showText(Context context, int resId, int duration) 
      throws Resources.NotFoundException { 
     Boast.makeText(context, resId, duration).show(); 
    } 

    /** 
    * Show a standard {@link Boast} that just contains a text view. Duration defaults to 
    * {@link Toast#LENGTH_SHORT}. 
    * 
    * @param context The context to use. Usually your {@link android.app.Application} or 
    *    {@link android.app.Activity} object. 
    * @param text The text to show. Can be formatted text. 
    */ 
    public static void showText(Context context, CharSequence text) { 
     Boast.makeText(context, text, Toast.LENGTH_SHORT).show(); 
    } 

    /** 
    * Show a standard {@link Boast} that just contains a text view with the text from a resource. 
    * Duration defaults to {@link Toast#LENGTH_SHORT}. 
    * 
    * @param context The context to use. Usually your {@link android.app.Application} or 
    *    {@link android.app.Activity} object. 
    * @param resId The resource id of the string resource to use. Can be formatted text. 
    * @throws Resources.NotFoundException if the resource can't be found. 
    */ 
    public static void showText(Context context, int resId) throws Resources.NotFoundException { 
     Boast.makeText(context, resId, Toast.LENGTH_SHORT).show(); 
    } 

    // //////////////////////////////////////////////////////////////////////////////////////////////////////// 

    /** 
    * Close the view if it's showing, or don't show it if it isn't showing yet. You do not normally 
    * have to call this. Normally view will disappear on its own after the appropriate duration. 
    */ 
    public void cancel() { 
     internalToast.cancel(); 
    } 

    /** 
    * Show the view for the specified duration. By default, this method cancels any current 
    * notification to immediately display the new one. For conventional {@link Toast#show()} 
    * queueing behaviour, use method {@link #show(boolean)}. 
    * 
    * @see #show(boolean) 
    */ 
    public void show() { 
     show(true); 
    } 

    /** 
    * Show the view for the specified duration. This method can be used to cancel the current 
    * notification, or to queue up notifications. 
    * 
    * @param cancelCurrent <code>true</code> to cancel any current notification and replace it with this new 
    *      one 
    * @see #show() 
    */ 
    public void show(boolean cancelCurrent) { 
     // cancel current 
     if (cancelCurrent) { 
      final Boast cachedGlobalBoast = getGlobalBoast(); 
      if ((cachedGlobalBoast != null)) { 
       cachedGlobalBoast.cancel(); 
      } 
     } 

     // save an instance of this current notification 
     setGlobalBoast(this); 

     internalToast.show(); 
    } 

} 
+1

спасибо, приятное чистое решение :-) –

+1

, похоже, не работает в прянике BTW, там старый тост остается видимым, и после него появляется новый тост –

+0

@thenail Thx для обратной связи. Какое устройство, если хотите? Работал на нашем устройстве Samsung 2.3, но не помню, какую модель. И работал над HTC Desire 2.2, Galaxy Nexus 4.1. Обратная связь оценена. –

2

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

myToast.setText(toastMsg); 
myToast.show(); 
1

Вы можете создать статический метод и использовать его, чтобы показать тост:

public static Toast toast = null; 
public static showToast(Context context,String msg){ 
if(toast!=null)    //this will cancel the toast on the screen if one exists 
    toast.cancel(); 
toast = Toast.makeText(context,msg); 
toast.show(); 
} 
9

Вам просто нужно объявить «Тост» вар так:

Toast toastMessage; 

Тогда в вашем функции, выполните следующие действия:

if (toastMessage!= null) { 
    toastMessage.cancel(); 
} 
toastMessage= Toast.makeText(context, "The message you want to display", duration); 
toastMessage.show(); 
0
public static Toast sToast=null; 

// create Toast object; 

public void showToast(String msg) 

    { 

    //here is checking whether toast object is null or not;if not null gonna cancel the toast that is showing in phone window and make it null; 

    if(sToast!=null) 
    { 

     sToast.cancel; 

    sToast=null; 
    } 

    //if toast object is null,gonna create new instance and make it shown on phone window. 

    if(sToast==null) 
    { 

     sToast=Toast.makeText(currentActivity.this,msg,Duration); 

     sToast.setGravity(); 

     sToast.show(); 

    } 

} 
+0

Не нужно проверять, имеет ли значение sToast значение null. Это всегда будет. –

0

Простой. Просто вызовите метод .cancel() на тосте, как только вы захотите создать другой тост.

Начните с определения переменной Toast в верхней части класса, как этот

private Toast mToast; 

Позже, когда вы хотите создать новый Toast (и есть старый исчезнуть), сделать это.

if(mToast != null) { 
    mToast.cancel(); //if a toast exists it deletes it, allowing you to create a new one 
} 


mToast = Toast.makeText(this, "This will show up now!", Toast.LENGTH_LONG); 
mToast.show(); //creates the new toast. 
0

Вы можете использовать технику съемки. Оке давайте начнем определение:

private Toast mToast; 
private showOnce=false; 

Позже, когда вы хотите показать тост раз:

if(showOnce==false){ 
    mToast=Toast.makeText(this, "Once!", Toast.LENGTH_LONG); 
    mToast.show(); 
    showOnce=true; 
}