当Snackbar解散自己时如何通知我?

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)

  • 现在不推荐使用setCallback().请改用addCallback() (11认同)

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)

  • 很高兴提到事件,因为单击actionText时也会调用onDismissed (3认同)
  • 在大多数情况下,最好检查“if (event != Snackbar.Callback.DISMISS_EVENT_ACTION)”,否则如果用户手动关闭或小吃店被另一个连续小吃店关闭,您的关闭逻辑将不会运行。 (2认同)

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可能甚至不适合你的情况.这只是为了大致了解我使用我已经拥有的代码段建议的实现.

  • and_dev的andswer现在是更好的答案. (4认同)

fab*_*fab 12

要在小吃栏显示或解除时收到通知,您可以通过setCallback(回调)提供Snackbar.Callback.


小智 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)


Cha*_*cki 7

在 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)


Vis*_*hel 5

当单击操作文本时,也会调用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)