【问题标题】: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上的任何位置?

标签: java android toast


【解决方案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() 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
相关资源
最近更新 更多