43

我正在使用com.android.support:design:22.2.0库中的Snackbar。我正在使用它来撤销删除。为了让我的生活更轻松,我将让用户界面看起来像事实上从数据源中被删除,并且如果没有按下快餐栏中的撤消按钮,实际上会从数据源执行删除操作。所以,我想知道什么时候Snackbar不再可见,所以删除这些项目是安全的。小吃店解散时我怎样才能得到通知?

我可以在Snackbar上调用getView(),但我不确定应该使用哪个侦听器。我试过setOnSystemUiVisibilityChangeListener(),但那不起作用,我相信它只适用于系统状态栏。

此外,Snackbar无法扩展,因为它具有私有构造函数。

+1

此功能将是在支持设计库 –

回答

89

Google设计库支持版本23中的Snackbar回调。请参阅Snackbar docsCallback docs。 后,您将会小吃吧被驳回(也显示时),然后得到通知,也被解雇的类型,如果这是对您有用:

snackbar.addCallback(new Snackbar.Callback() { 

    @Override 
    public void onDismissed(Snackbar snackbar, int event) { 
     //see Snackbar.Callback docs for event details 
     ... 
    } 

    @Override 
    public void onShown(Snackbar snackbar) { 
     ... 
    } 
    }); 
+6

setCallback()现在已被弃用。使用addCallback()而不是 – jds17

1

目前你无法实现它。

快餐栏暗淡时没有调用者。

最简单的方法是临时保存其他地方的记录(即使是局部变量),然后在碰到撤消按钮时重新插入记录。

13

最近我自己偶然发现了这个问题,当滚动和显示Snackback时,在第一个消失之前显示的太多。我不得不找到一种方法来知道应用程序是否应该制定Snackbar。

我个人发现这个解决方案。

确实Snackbar本身并没有为它的状态/可见性提供任何类型的监听器,但是你仍然可以从Snackbar(getView();)中获取视图对象。从视图对象中,您有机会使用各种方法来添加侦听器。

要实现它,您必须走出常见的“一体式”Toast/Snackbar用法,因为添加听众返回void

我个人发现OnAttachStateChangeListener满足我的需求。

用我的代码删除一个snipper,以防它可能对您有用。

Snackbar snack = Snackbar.make(getView(), "My Placeholder Text", Snackbar.LENGTH_LONG); 

snack.getView().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
    @Override 
     public void onViewAttachedToWindow(View v) { 
      canDisplaySnackbar = false; 
     } 

    @Override 
    public void onViewDetachedFromWindow(View v) { 

     Handler h = new Handler(); 
     h.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       canDisplaySnackbar = true; 

       } 
     }, 1000); 
    } 
}); 
snack.show(); 

请注意,这只是我的实现我自己的问题,Handler与postDelayed Runnable可能甚至不适合你的情况。这只是给我一个关于我使用我已经拥有的片段的建议的总体思路。

+0

的下一个版本这是正确的答案 –

+4

and_dev的andswer是更好的答案了。 –

11

要在小吃店被显示或解雇时得到通知,您可以通过setCallback(回叫)提供Snackbar.Callback。

+0

这应该是现在正确的答案。 –

+0

setCallBack现已弃用,请使用addCallBack而不是 – mjn42

12
snackbar.setCallback(new Snackbar.Callback() { 

     @Override 
     public void onDismissed(Snackbar snackbar, int event) { 
      if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) { 
       // Snackbar closed on its own 
      } 
     } 

     @Override 
     public void onShown(Snackbar snackbar) { 
      ... 
     } 
    }); 
+0

很好的提及这个事件,因为onDismissed在actionText被点击的时候也被调用 –

1

onDismissed也被称为需要把一个条件像

event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT 

现在新的代码如下所示。

final Snackbar snackBar = Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG); 

snackbar.addCallback(new Snackbar.Callback() { 

@Override 
public void onDismissed(Snackbar snackbar, int event) { 
if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) { 
     // Snackbar closed on its own 
    } 
} 

@Override 
public void onShown(Snackbar snackbar) { 
... 
} 
}); 
snackBar.show(); 
+0

仅仅回答代码不会给未来的读者提供太多的信息,请给你写的内容提供一些解释 – WhatsThePoint