43

我正在使用com.android.support:design:22.2.0庫中的Snackbar。我正在使用它來撤銷刪除。爲了讓我的生活更輕鬆,我將讓用戶界面看起來像事實上從數據源中被刪除,並且如果沒有按下快餐欄中的撤消按鈕,實際上會從數據源執行刪除操作。所以,我想知道什麼時候Snackbar不再可見,所以刪除這些項目是安全的。小吃店解散時我怎樣才能得到通知?

我可以在Snackbar上調用getView(),但我不確定應該使用哪個偵聽器。我試過setOnSystemUiVisibilityChangeListener(),但那不起作用,我相信它只適用於系統狀態欄。

此外,Snackbar無法擴展,因爲它具有私有構造函數。

+1

此功能將是在支持設計庫 –

回答

89

Google設計庫支持版本23中的Snackbar回調。請參閱Snackbar docsCallback docs。 後,您將會小吃吧被駁回(也顯示時),然後得到通知,也被解僱的類型,如果這是對您有用:

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) { 
     ... 
    } 
    }); 
+6

setCallback()現在已被棄用。使用addCallback()而不是 – jds17

1

目前你無法實現它。

快餐欄暗淡時沒有調用者。

最簡單的方法是臨時保存其他地方的記錄(即使是局部變量),然後在碰到撤消按鈕時重新插入記錄。

13

最近我自己偶然發現了這個問題,當滾動和顯示Snackback時,在第一個消失之前顯示的太多。我不得不找到一種方法來知道應用程序是否應該制定Snackbar。

我個人發現這個解決方案。

確實Snackbar本身並沒有爲它的狀態/可見性提供任何類型的監聽器,但是你仍然可以從Snackbar(getView();)中獲取視圖對象。從視圖對象中,您有機會使用各種方法來添加偵聽器。

要實現它,您必須走出常見的「一體式」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(); 

請注意,這只是我的實現我自己的問題,Handler與postDelayed Runnable可能甚至不適合你的情況。這只是給我一個關於我使用我已經擁有的片段的建議的總體思路。

+0

的下一個版本這是正確的答案 –

+4

and_dev的andswer是更好的答案了。 –

11

要在小吃店被顯示或解僱時得到通知,您可以通過setCallback(回叫)提供Snackbar.Callback。

+0

這應該是現在正確的答案。 –

+0

setCallBack現已棄用,請使用addCallBack而不是 – mjn42

12
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) { 
      ... 
     } 
    }); 
+0

很好的提及這個事件,因爲onDismissed在actionText被點擊的時候也被調用 –

1

onDismissed也被稱爲需要把一個條件像

event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT 

現在新的代碼如下所示。

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(); 
+0

僅僅回答代碼不會給未來的讀者提供太多的信息,請給你寫的內容提供一些解釋 – WhatsThePoint