更改片段后如何取消显示堆叠的吐司?
Posted
技术标签:
【中文标题】更改片段后如何取消显示堆叠的吐司?【英文标题】:How to cancel stacked toast from showing after changing fragment? 【发布时间】:2020-07-22 10:54:30 【问题描述】:我想在用户转到另一个 Fragment 后删除堆叠的 android Toast。我有堆叠的片段,在每个片段中,我有两个按钮触发不同的 Toast 消息。当片段的操作完成并且用户导航到另一个片段或按下返回按钮时,Toast 将保持显示。这主要发生在用户点击按钮太快并强制 Toast 堆叠时。
或者当我实例化全局 Toast 对象并调用 cancel() 时,无论用户点击按钮多少次,两个 toast 都不会在片段的生命周期中显示。
toast1 = new Toast(getContext());
toast2 = new Toast(getContext());
showFirstToast(toast1).show();
showSecondToast(toast2).show();
private Toast showFirstToast(Toast toast)
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout_correct, (ViewGroup)
getActivity().findViewById(R.id.toast_layout));
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
return toast;
【问题讨论】:
Toast 用于系统/关键类型的消息,因此在正确使用时,您不希望它们在导航到其他地方时消失。另一种方法是使用 SnackBar,当您离开时它会消失。 这可能是因为我正在尝试使用 Toast 来通知该过程的完成。 SnackBars aperance 动画是否可定制?我希望它像 Toast 一样淡入/淡出。 看起来是的,setAnimationMode(BaseTransientBottomBar.ANIMATION_MODE_FADE)
。
而且它可以定位在View上的任何位置?
见这里:***.com/questions/31492351/…
【参考方案1】:
不要使用全局Toast
对象,而应使用Toast
的多个实例。所以,你可以一一取消。
toast1 = new Toast(getContext());
toast2 = new Toast(getContext());
showFirstToast(toast).show();
showSecondToast(toast).show();
toast1.cancel()
【讨论】:
我也试过了,但问题仍然存在。我已经编辑了这个问题以便更好地理解。【参考方案2】:为了避免堆积的吐司,我重复使用一个吐司
Toast toast;
protected void showToast(final String text)
if (toast == null)
toast = Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT);
else
toast.setText(text); // smoother transition than cancel + new toast
toast.show();
@Override
public void onPause()
if(toast != null)
toast.cancel();
super.onPause();
【讨论】:
有什么方法可以像在 onPause() 中那样在 Fragment 事务中使用 toast.cancel() 吗?以上是关于更改片段后如何取消显示堆叠的吐司?的主要内容,如果未能解决你的问题,请参考以下文章