【问题标题】:SnackBar still showing when I come back to previous Activity当我回到上一个活动时,SnackBar 仍然显示
【发布时间】:2016-02-03 12:19:41
【问题描述】:

我在Activity A 中有一个SnackBar,如果我点击Activity A 中的Button,我会导航到Activity B。如果我立即返回,我可以看到SnackBar 仍在显示在ActivityA.

一旦用户离开Activity,如何制作SnackBardismiss

我的努力:

编写了一个通用类来处理 SnackBar 和的创建和解除

创建小吃吧:

public static Snackbar showSnackBar(View view, int text) {
    if(snackBar != null && snackBar.isShown()) {
        snackBar.setText(text);
    } else {
        snackBar = snackBar.make(view, text, Snackbar.LENGTH_LONG);
    }
    if (!AppRunningState.isApplicationBroughtToBackgrounds(App.get())) {
        snackBar.show();
    }
    return snackBar;
}

onPause:

@Override
protected void onPause() {
    super.onPause();
    SVSnackBar.dismissSnackBar();
}

public static void dismissSnackBar() {
    if (snackBar != null) {
        snackBar.dismiss();
    }
}

【问题讨论】:

  • 使用 startActivity 作为结果。如果它来自 B 那么你可以隐藏小吃店
  • 不是在一种情况下,我需要一种通用的方法来做到这一点
  • 谁投了反对票,你能说明原因吗??
  • 如何处理 onShown 和 onDismissed ?我想在离开活动时将其关闭。我不想在它被解雇时收到通知。准备好我的问题@AmitVaghela
  • 已添加,请查看

标签: android android-activity android-snackbar


【解决方案1】:

嗯...通常您只需将一个 Snackbar 用于一个活动/布局。因此,一种方法是编写一个 BaseActivity 来保存对 Snackbar 的引用。

public class BaseActivity extends Activity { // use the one you want to extend

    private Snackbar snackbar;

    public void showSnackbar(View view, int textResId) {
        if (snackbar != null) {
            snackbar.dismiss();
        }
        snackbar = Snackbar.make(view, textResId, Snackbar.LENGTH_LONG);
        snackbar.show();
    }

    @Override
    public void onPause() {
        super.onPause();
        if (snackbar != null) {
            snackbar.dismiss();
        }
     }
}

现在始终为您正在使用的每个 Activity 扩展 BaseActivity。这基本上与您正在做的事情相同,但您不需要额外的类来处理您的 Snackbar,并且您不必每次都覆盖 onPause()。

【讨论】:

  • 您的意思是,如果您扩展 BaseActivity,则在运行时设置的值在您启动的所有下一个扩展 BaseActivity 的活动中将是相同的?如果是的话,那对我来说是新的。但如果你是这个意思,我认为你是对的。
  • 如果A和B扩展BaseActivity,在A中实例化snackbar没关系,启动B时snackbar为null。条件“snackbar != null”将始终为 false。
  • A 和 B 互不相关,没错。无论如何,您应该先关闭一个小吃店,然后再尝试展示另一个。问题是你不知道你之前是否实例化了一个snackbar,所以你必须做空检查。第一次使用 BaseActivity#showSnackbar 检查将是错误的。在同一活动中使用此方法的所有其他时间检查将是真的。
【解决方案2】:

当您启动其他活动时,请在Snackbar 上调用dismiss()

【讨论】:

  • 每次我开始一个新的活动时都不能这样做。我需要一种更通用的方式来编写一次并且一直发生
【解决方案3】:

试试这个代码。这应该可以解决问题。

   snackbar = Snackbar.make(loginView, text, Snackbar.LENGTH_LONG);
        snackbar.setActionTextColor(getResources().getColor(R.color.colorAccent));
        snackbar.setAction("Close", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                snackbar.dismiss();
            }
        });
        snackbar.show();

这里 setAction() 是可选的。仅当您想在持续时间结束前关闭快餐栏时才需要使用。

编辑:

您所面临的问题可能是因为您调用了 showSnackBaronCreate 方法或您调用的任何方法中 在 onCreate 中。它只是一个假设,因为你没有给出 完整的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多