現在表示されているすべてのトースト メッセージを削除するにはどうすればよいですか?
私のアプリには、ユーザーがアイテムをクリックすると、10 個のアイテム - 10 個のトースト メッセージのトースト メッセージが表示されるリストがあります。
したがって、ユーザーが 10 回クリックしてからメニュー ボタンを押すと、メニュー オプションのテキストが読めるようになるまで数秒待たなければなりません。
そんなはずはありません:)
私の解決策は、アクティビティで単一のトーストを初期化することでした。次に、クリックするたびにテキストを変更します。
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();
}
現在処理中のすべてのトースト メッセージを無効にするにはどうすればよいですか?
Toasts
オブジェクトを呼び出すことcancel()
で、個別にキャンセルできToast
ます。ただし、未処理の をすべてキャンセルする方法はありませんToasts
。
トーストが既に表示されているかどうかを確認するのはどうですか?
private Toast toast;
...
void showToast() {
if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
toast.show();
}
}
button
Mudar のソリューションは、同様の問題でうまく機能しました。複数回クリックした後、さまざまなトーストがバックログに積み重なっていきました。
setText()s
とが異なる Toast の 1 つのインスタンスshow()
は、まさに私が探していた答えでした。新しいボタンがクリックされるとすぐに前のメッセージがキャンセルされました。スポットオン
参考までに、私がやったことは...
でOnCreate
:
final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);
それぞれの中でOnClick
:
myToast.setText(R.string.toast1);
myToast.show();
私の解決策は、すべてのトースト参照をリストに保存し、必要に応じてすべてをキャンセルするメソッドを作成することです。
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();
これをグローバル クラスの静的メソッドのように作成し、それを使用してアプリのすべてのトーストを強制終了できます。
トーストメッセージをキューに入れないようにする方法を見つけたと思います。私が共有すると思った。
この部分が一番上になります。
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 に設定し、再び表示できるようにします。
これが私のやり方です。
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();
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();
}
});
私のアプリでは、アプリがバックグラウンドになるとキューに入れられたトーストが何度も表示されるため、問題を解決するために次のことを行いました。
アプリがバックグラウンドに移行したことを検出するコードを追加します。ライフサイクル ハンドラを登録する 1 つの方法。詳細については参照
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();
て、現在のトーストと保留中のトーストをすべて非表示にします。コードは楽しいです。楽しみ!
このように使用できます..
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();
}
}
上記の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);
}
メッセージを分類する理由は、重要なメッセージが上書きされないようにするためです。このソリューションは、トーストと関数名の名前を変更するだけなので、簡単に再利用できます。
ユーザーがボタンをスパムすると、トーストは同じメッセージ タイプに対して毎回キャンセルされます。唯一の問題は、ユーザーがさまざまなメッセージをスパム送信できるかどうかです。これにより、最初のメッセージが繰り返され、最終的に期限切れになると、他のメッセージが 1 回ずつ表示されます。特に大きな問題ではありませんが、注意が必要です。
複数の Toast インスタンスを持つことの潜在的な欠点については調べていません。
トースト メッセージを無効にしてshow()
式を削除する方法は次のとおりです。
//Disable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT);
//Enable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();