現在表示されているすべてのトーストメッセージを削除するにはどうすればよいですか?
私のアプリにはリストがあり、ユーザーがアイテムをクリックすると、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();
}
}
Mudarのソリューションは、同様の問題で私にとってはうまく機能しました。複数のbutton
クリックの後、バックログにさまざまなトーストが積み重ねられていました。
異なるsetText()s
とshow()
sを持つToastの1つのインスタンスがまさに私が探していた答えでした-新しいボタンがクリックされるとすぐに前のメッセージがキャンセルされました。スポット
参考までに、私がやったことは...
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
オブジェクトを作成します。
private Toast example;
これで、新しいToastメッセージを呼び出したいときはいつでも次のようにします。
if(buttonClicked) {
example.cancel();
example = Toast.makeText(this, "" , Toast.LENGTH_SHORT);
example.setText("Button Clicked");
example.show();
}
これにより、すべてのトーストが1つの中央のトーストに保持され、トーストスパムが削除されます。これは手っ取り早い解決策なので、もっとエレガントな方法があるかもしれません。
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();
}
これが私のやり方です。
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();
}
});
これらはどうですか !?
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();
..
}
私のアプリでは、アプリがバックグラウンドになったときに何度も現れるトーストが並んでいたので、問題を解決するためにフォローしました。
アプリがバックグラウンドになるときを検出するコードを追加します。ライフサイクルハンドラーを登録する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();
メソッドを呼び出して、現在およびすべての保留中のトーストを非表示にします。コードは楽しいです。楽しい!
上記の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インスタンスを使用することのマイナス面については検討していません。
このように使用できます。
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();
}
}