2017-08-16 78 views
1

我有两个状态之间的切换,点击后显示一个快餐栏与当前状态。如果用户快速地将状态切换回第四个,则可能许多小吃店排队等待,这些小吃店会彼此出现,指示其中一个状态而另一个可能处于活动状态。这可能会让用户感到困惑,所以我想我会在创建新的时候解雇另一个州的小吃店。检测小吃店被解雇(而不是被禁止)

为了达到此目的,我称之为旧快餐店的方法dismiss()。这是一个问题:当我切换状态时,即当我在旧的快餐栏和旧的快餐栏已经处于关闭动画状态时,即dismiss()旧的和show()10,dismiss()调用动画重新启动,产生图形故障(几乎被解雇的旧小吃店被重新解雇)。请注意,旧小吃店的解雇动画可由我自己发起(呼叫dismiss())或系统(超时后)发起。

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

我也尝试获得小吃店的View并添加OnLayoutChangeListener,但只能听到小吃店的创建,不会在解雇时使用。

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

回答

0

当您关闭的小吃吧,你可以保存当前时间:

long snackbarDismissStartTime = System.currentTimeMillis(); 

然后,检查是否小吃吧,目前正在解雇,这样做:

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

250是多少小数点动画完成所需的毫秒数,如BaseTransientBottomBar常数ANIMATION_DURATION所指定。当然,不能保证这个值在未来不会改变。

如果您想确保解雇完成,您还可能需要添加约100ms的模糊因子(就像我自己的经验似乎需要的那样)。

+0

这将检测()'的小吃店仍然被解雇后,我打电话'解雇,这是问题的一部分。另一个问题是系统在自发超时后开始解雇。在这种情况下,我不会在旧快餐栏上调用'dismiss()',但系统会这样。好的是我知道什么时候,因为我可以指定小吃店的持续时间。因此,通过这些信息,您的答案可以扩展到任何小吃店。甚至可以重写'dismiss()'来包含这个检查,但我不确定,因为我现在无法检查。我已编辑澄清这一点。 – Erik

0

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

https://github.com/tingyik90/snackprogressbar