2017-08-16 68 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