我在两种状态之间切换,点击后显示当前状态的快餐栏。如果用户快速将状态切换回第四个,则可能许多小吃排队将排在彼此之后,指示任一状态而另一个可能是活动的。这可能会让用户感到困惑,所以我想在创建一个新的小吃吧后,我会解雇其他州的小吃店。
为了达到这个目的,我打电话给旧的零食吧dismiss()
方法。这有一个问题:当我切换状态时,即当我dismiss()
旧的和show()
新的快餐栏,而旧的快餐栏已经处于其解雇动画时,{{1}调用强制动画重新启动,创建一个图形故障(几乎被解雇的旧快餐栏被重新解雇)。请注意,旧的快餐栏解散动画可以由我自己发起(调用dismiss()
)或由系统启动(超时后)。
解决方案是检测正在或即将被解雇的小吃店。有dismiss()
类Snackbar.Callback
方法,但该方法仅在解雇动画完成后调用。我想在解雇期间或之前检测小吃店。类onDismissed()
的布尔方法isShown()
也没有用处:小吃栏一直显示,直到解雇结束。
我还试图获得快餐栏BaseTransientBottomBar
并添加View
,但这只是听取了小吃店的创建,并且在解雇时不会被使用。
如何检测即将被解雇的小吃店?
答案 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队列。希望它能解决你的问题。