如何删除当前显示的所有 toast 消息?
在我的应用程序中,有一个列表,当用户点击一个项目时,会显示一条 toast 消息,10 个项目 - 10 条 toast 消息。
因此,如果用户点击 10 次,然后按下菜单按钮,他们必须等待几秒钟,直到他们能够阅读菜单选项文本。
不应该是这样的:)
我的解决方案是在活动中初始化一个 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();
}
如何禁用当前正在处理的所有 toast 消息?
Toasts
您可以通过调用对象cancel()
来取消个人。Toast
AFAIK,但是,您无法取消所有未完成Toasts
的。
检查是否已经显示了 toast 怎么办?
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
一个具有不同和s的 Toast 实例show()
正是我正在寻找的答案 - 单击新按钮后,先前的消息就会取消。发现
仅供参考,这就是我所做的...
在OnCreate
:
final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);
在每个OnClick
:
myToast.setText(R.string.toast1);
myToast.show();
我的解决方案是将所有 toast 引用保存在一个列表中,并在需要时创建一个方法来取消它们:
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();
您可以像在全局类中创建一个静态方法一样创建它,并使用它来杀死应用程序的所有 toast。
这是我对这个问题的简单回答:
首先在您的活动中创建一个全局Toast
对象。
private Toast example;
现在,每当您想调用新的 Toast 消息时,只需执行以下操作:
if(buttonClicked) {
example.cancel();
example = Toast.makeText(this, "" , Toast.LENGTH_SHORT);
example.setText("Button Clicked");
example.show();
}
这将所有 Toast 保留在一个中央 Toast 中并删除 Toast 垃圾邮件。这是一个快速粗略的解决方案,所以也许有一种更优雅的方法来做到这一点。
我想我找到了一种方法来让敬酒消息不为我排队。以为我会分享。
这部分在顶部。
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 秒,然后将我的 toast 对象设置为 null 并允许它再次显示。
在函数外部创建一个 Toast 对象onClick
并使用下面的代码。它将停止任何现有的 Toast 并启动最新的 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();
}
Kotlin Version
通过Extension Function
取消先前显示Toast
并立即显示新的最好方法是保留对当前显示的引用以便Toast
能够取消它。所以使用这些扩展函数真的很有帮助:
import android.content.Context
import android.widget.Toast
import androidx.annotation.StringRes
/**
* @author aminography
*/
private var toast: Toast? = null
fun Context.toast(message: CharSequence?) {
toast?.cancel()
toast = message?.let { Toast.makeText(this, it, Toast.LENGTH_SHORT) }?.apply { show() }
}
fun Context.longToast(message: CharSequence?) {
toast?.cancel()
toast = message?.let { Toast.makeText(this, it, Toast.LENGTH_LONG) }?.apply { show() }
}
fun Context.toast(@StringRes message: Int) {
toast?.cancel()
toast = Toast.makeText(this, message, Toast.LENGTH_SHORT).apply { show() }
}
fun Context.longToast(@StringRes message: Int) {
toast?.cancel()
toast = Toast.makeText(this, message, Toast.LENGTH_LONG).apply { show() }
}
context.toast("Text 1")
context.longToast("Text 2")
context.toast(R.string.text3)
context.longToast(R.string.text4)
我就是这样做的。
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();
在Kotlin中,这很容易解决。
在我的示例中,我在用户单击按钮时切换排序类型。如果用户快速点击按钮,它将在显示sortToast
另一个之前取消当前显示。
private var sortToast: Toast? = null
sortButton.onClickListener {
sortToast?.cancel()
sortToast = Toast.makeText(context, "Sort by toggled", Toast.LENGTH_SHORT)
sortToast?.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);
}
对消息进行分类的原因是确保没有重要消息被覆盖。这个解决方案似乎很容易重用,因为它只涉及重命名 Toast 和函数名称。
当用户向按钮发送垃圾邮件时,每次相同消息类型的 toast 都会取消。唯一的问题是用户是否可以发送混杂的垃圾邮件。这会导致第一条消息重复,一旦它最终过期,其他消息就会显示一次。不是一个真正的大问题,但需要注意的事情。
我还没有研究过拥有多个 Toast 实例的可能缺点。
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();
}
});
可以这样用。。
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();
}
}
这些怎么样 !?
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();
..
}
在我的应用程序中,当应用程序进入后台时,排队的祝酒词一次又一次地出现,所以我做了以下操作来解决问题。
添加代码以检测应用何时进入后台。一种注册生命周期处理程序的方法。有关更多详细信息,请参阅
registerActivityLifecycleCallbacks(new MyLifecycleHandler());
App.inBackground = true;
当应用程序进入后台并使用 SmartToast 类显示 toast
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();
当应用程序进入后台以隐藏当前和所有待处理的 toast 时调用方法。代码很有趣。享受!
Here's how to disable toast messages, remove show()
expression.
//Disable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT);
//Enable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();