检测Snackbar被解雇(不是故障)

时间:2017-08-16 10:27:18

标签: android-snackbar

我在两种状态之间切换,点击后显示当前状态的快餐栏。如果用户快速将状态切换回第四个,则可能许多小吃排队将排在彼此之后,指示任一状态而另一个可能是活动的。这可能会让用户感到困惑,所以我想在创建一个新的小吃吧后,我会解雇其他州的小吃店。

为了达到这个目的,我打电话给旧的零食吧dismiss()方法。这有一个问题:当我切换状态时,即当我dismiss()旧的和show()新的快餐栏,而旧的快餐栏已经处于其解雇动画时,{{1}调用强制动画重新启动,创建一个图形故障(几乎被解雇的旧快餐栏被重新解雇)。请注意,旧的快餐栏解散动画可以由我自己发起(调用dismiss())或由系统启动(超时后)。

解决方案是检测正在或即将被解雇的小吃店。有dismiss()Snackbar.Callback方法,但该方法仅在解雇动画完成后调用。我想在解雇期间之前检测小吃店。类onDismissed()的布尔方法isShown()也没有用处:小吃栏一直显示,直到解雇结束。

我还试图获得快餐栏BaseTransientBottomBar并添加View,但这只是听取了小吃店的创建,并且在解雇时不会被使用。

如何检测即将被解雇的小吃店?

2 个答案:

答案 0 :(得分:0)

当您关闭小吃店时,您可以节省当前时间:

long snackbarDismissStartTime = System.currentTimeMillis();

然后,要检查小吃店目前是否被解雇,请执行以下操作:

if (System.currentTimeMillis() < snackbarDismissStartTime + 250)
{
   // snackbar is currently being dismissed
}

250是由BaseTransientBottomBar常量ANIMATION_DURATION指定的零食栏动画完成所需的毫秒数。当然,无法保证此值不会在未来发生变化。

如果你想绝对确定解雇已经结束,你也可能想要添加一个大约100毫秒的软糖因子(就像我自己的经验所需要的那样)。

答案 1 :(得分:0)

我写了一个名为SnackProgressBar的库。它包括一个可能有用的扩展排队系统。在显示新的SnackProgressBar之前,您可以通过简单的clearAll()调用清除所有堆叠的SnackProgressBar队列。希望它能解决你的问题。

https://github.com/tingyik90/snackprogressbar