更改片段后如何取消显示堆叠的吐司?

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() 吗?

以上是关于更改片段后如何取消显示堆叠的吐司?的主要内容,如果未能解决你的问题,请参考以下文章

异步任务类完成后如何更改文本视图的值(在片段中)?

更改片段时显示 ProgressBar - Android

如何更改以不同显示尺寸显示片段的方式?

方向/配置更改后如何维护 ListView 片段状态?

显示/隐藏片段并以编程方式更改可见性属性

如何更改片段中的主要活动变量