销毁Fragment时取消活动的snack bar

6
我该如何确保任何可见的 Snackbar(特别是那些具有 snackbar.length_indefinite 属性的 Snackbar)在 Fragment 销毁时被关闭?
我应该为所有 Snackbar 使用一个共用的全局变量,并在其上调用 dismiss 吗?像下面这样:
Fragment1.java
private Snackbar snackbar;

@Override
public onDestroy(){
    snackbar.dismiss();
}

public Method1(){
    snackbar = Snackbar.make(ActivityMain.coordinatorLayout, "Text 1", snackbar.length_indefinite);
    snackbar.show();
}

public Method2(){
    snackbar = Snackbar.make(ActivityMain.coordinatorLayout, "Text 2", snackbar.length_indefinite);
    snackbar.show();
}
//coordinatorLayout is a static variable in ActivityMain which stores reference to the CoordinatorLayout
2个回答

5

如何确保任何可见的Snackbar(特别是那些具有snackbar.length_indefinite的)在片段销毁后将被解除显示?

要解除显示,请调用onDestroy()方法,就像您已经做的那样

我应该为所有Snackbar使用公共全局变量,并对其进行解除显示吗?类似下面这样的东西?

是的,您可以这样做,因为Snackbar在您的类中使用多次。因此,最好将其声明为全局变量。

developer.android.com上查看更多有关Snackbar的详细信息。


1
虽然这是一篇旧帖子,但我想补充一下,如果您计划在片段生命周期内显示多个 snackbar(不同时),拥有一个全局 snackbar 变量将无法正常工作。 - abdfahim

1

虽然全局 SnackBar 并确保在 onDestroyView() 中关闭它是一个不错的做法。

我建议将你的 Fragment XML 布局包装在 CoordinatorLayout 中,并将片段根视图传递给 Snackbar.make 函数,如下所示:

fragment_your_fragment.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<!-- Your Layout Content  -->

</androidx.coordinatorlayout.widget.CoordinatorLayout>

YourFragment.kt

fun showSnackbar() {
    Snackbar.make(requireView(), "Your message", Snackbar.LENGTH_INDEFINITE).show()
}

这样,当您打开另一个片段(将其添加到堆栈中)时,Snackbar将自动消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接