web-dev-qa-db-ja.com

Android-表示されているトーストメッセージをすべて非表示にする

現在表示されているすべてのトーストメッセージを削除するにはどうすればよいですか?

私のアプリにはリストがあり、ユーザーがアイテムをクリックすると、10個のアイテム-10個のトーストメッセージが表示されます。

そのため、ユーザーが10回クリックしてからメニューボタンを押した場合、メニューオプションテキストを読むことができるまで数秒間待つ必要があります。

それはそのようであってはなりません:)

53
crazyV

私の解決策は、アクティビティで単一のトーストを初期化することでした。次に、クリックするたびにテキストを変更します。

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();
}
78
Mudar

現在処理中のトーストメッセージをすべて無効にするにはどうすればよいですか?

Toastsオブジェクトでcancel()を呼び出すことにより、個々のToastをキャンセルできます。ただし、未処理のToastsをすべてキャンセルする方法はありません。

31
CommonsWare

トーストが既に表示されているかどうかを確認するのはどうですか?

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

Mudarのソリューションは、同様の問題で私にとってはうまく機能しました。複数のbuttonクリックの後、バックログにさまざまなトーストが積み重ねられていました。

異なるsetText()sshow() sを持つToastの1つのインスタンスがまさに私が探していた答えでした-新しいボタンがクリックされるとすぐに前のメッセージがキャンセルされました。スポット

参考までに、私がやったことは...

OnCreateで:

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

OnClick内:

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

私の解決策は、すべてのトースト参照をリストに保存し、必要なときにそれらをすべてキャンセルするメソッドを作成することです:

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

これをグローバルクラスの静的メソッドのように作成し、それを使用してアプリのすべてのトーストを強制終了できます。

4
user23

トーストメッセージをキューに入れないようにする方法を見つけたと思います。私は共有すると思いました。

この部分が一番上になります。

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に設定し、再度表示できるようにします。

3
S.A.Jay

問題に対する私の簡単な答えは次のとおりです。

最初にアクティビティでグローバルToastオブジェクトを作成します。

    private Toast example;

これで、新しいToastメッセージを呼び出したいときはいつでも次のようにします。

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

これにより、すべてのトーストが1つの中央のトーストに保持され、トーストスパムが削除されます。これは手っ取り早い解決策なので、もっとエレガントな方法があるかもしれません。

3
Roymunson

onClick関数の外側にToastオブジェクトを作成し、以下のコードを使用します。既存のトーストを停止し、最新のトーストを開始します。

Toast mToast;

public void onClick(String abc) {

    if(mToast!=null)
        mToast.cancel();
    Context context = this;
    mToast = Toast.makeText(context, abc, Toast.LENGTH_SHORT);
    mToast.show();
}
2
Akash Gupta

これが私のやり方です。

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();
1
Victor Odiah
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
balu

これらはどうですか !?

private Toast toast;

...
// Methods for short toast messages and long toast messages

    private void showShortToast(String message) {
        if(null != toast) toast.cancel();
        (toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT)).show();
    }

    private void showLongToast(String message) {
        if(null != toast) toast.cancel();
        (toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG)).show();
    }

およびonPause()で

@Override
    protected void onPause() {
...
if(null != toast) toast.cancel();
..
}
0
Pramod P K

私のアプリでは、アプリがバックグラウンドになったときに何度も現れるトーストが並んでいたので、問題を解決するためにフォローしました。

アプリがバックグラウンドになるときを検出するコードを追加します。ライフサイクルハンドラーを登録する1つの方法。詳細 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();メソッドを呼び出して、現在およびすべての保留中のトーストを非表示にします。コードは楽しいです。楽しい!

0
Qamar

上記の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と関数名の名前を変更するだけであるため、再利用しやすいようです。

ユーザーがボタンをスパムすると、トーストは同じメッセージタイプに対して毎回キャンセルされます。唯一の問題は、ユーザーがさまざまなメッセージをスパム送信できるかどうかです。これにより、最初のメッセージが繰り返され、最終的に期限が切れると、他のメッセージがそれぞれ1回ずつ表示されます。それほど大きな問題ではありませんが、注意すべき点があります。

複数のToastインスタンスを使用することのマイナス面については検討していません。

0
David

このように使用できます。

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