Tyl*_*aff 66 android material-design snackbar android-design-library android-snackbar
我正在使用com.android.support:design:22.2.0图书馆的Snackbar .我用它来撤消删除.为了让我的生活更轻松,我将使UI看起来实际上已从数据源中删除了内容,如果未按下小吃栏中的撤消按钮,则实际执行数据源中的删除操作.所以,我想知道什么时候Snackbar不再可见,所以删除这些项目是安全的.
我可以在Snackbar上调用getView(),但我不确定我应该使用什么样的监听器.我试过setOnSystemUiVisibilityChangeListener()但是没有用,我相信它只适用于系统状态栏.
此外,Snackbar无法扩展,因为它有一个私有构造函数.
and*_*dev 149
Google设计库支持版本23中的Snackbar回调.请参阅Snackbar文档和回调文档.然后,当Snackbar被解雇时(以及显示时),您将收到通知,如果这对您有用,则会被解雇:
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) {
...
}
});
Run Code Online (Sandbox Code Playgroud)
Ana*_*nth 29
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) {
...
}
});
Run Code Online (Sandbox Code Playgroud)
Fra*_*coC 16
最近我偶然发现了这个问题,当滚动和显示Snackback时,在第一个甚至消失之前显示了太多.我必须找到一种方法来了解应用程序是否应该放置Snackbar.
我亲自找到了这个解决方案
确实,Snackbar本身并没有为它的状态/可见性提供任何类型的监听器,但你仍然可以从Snackbar中获取View对象(getView();).从View对象中,您有机会使用各种方法来添加侦听器.
要实现它,你必须走出常见的"一体化"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();
Run Code Online (Sandbox Code Playgroud)
请注意,这只是我自己的问题的实现,带有postDelayed Runnable的Handler可能甚至不适合你的情况.这只是为了大致了解我使用我已经拥有的代码段建议的实现.
小智 11
Snackbar.addCallback在Kotlin中
val snackBar = Snackbar
.make(view, "Text Snackbar", Snackbar.LENGTH_LONG)
.addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
override fun onShown(transientBottomBar: Snackbar?) {
super.onShown(transientBottomBar)
}
override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
super.onDismissed(transientBottomBar, event)
}
})
val snackBarView = snackBar.view
snackBarView.setBackgroundColor(Color.RED)
snackBar.show()
Run Code Online (Sandbox Code Playgroud)
在 Kotlin 中,这对我有用:
Snackbar.make(
binding.root,
getString(R.string.ticket_posted),
LENGTH_LONG)
.setAction(getString(R.string.undo)) {
Log.d(TAG, "Try to undo ticket $key")
}
.addCallback(object : BaseCallback<Snackbar>() {
override fun onDismissed(
transientBottomBar: Snackbar?,
event: Int
) {
super.onDismissed(transientBottomBar, event)
if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
Log.d(TAG, "Try to reset")
}
}
})
.show()
}
Run Code Online (Sandbox Code Playgroud)
当单击操作文本时,也会调用onDismissed,因为该原因需要设置一个条件,例如
event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT
Run Code Online (Sandbox Code Playgroud)
现在,新代码如下所示。
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();
Run Code Online (Sandbox Code Playgroud)