2015-06-27 48 views
15

我看到,確定其上的屏幕顯示的長度時,小吃吧將只需要要麼LENGTH_LONG或LENGTH_SHORT。的Android支持庫小吃吧與不定長度

我想顯示它,直到有人將它從屏幕上滑下來。對於某些情況下,如果您持續出現錯誤,例如您沒有互聯網,並且您希望在選擇LENGTH_LONG後2750毫秒後通知用戶而不會在屏幕上消失,則會出現這種情況。

當然,我可以使用setDuration到可笑的長毫秒值,但有沒有辦法設置好它,這樣它不會消失,直到用戶將其關閉?

+2

值得注意的是,Material Design的準則明確指出Snackbars是瞬態視圖元素。這意味着它們不應該卡在屏幕上,因爲它們會阻擋屏幕上的其他元素。 –

+0

同意和好點。你認爲沒有互聯網消息必須建立在我的用戶界面的視圖,而不是?如果小吃店不是合適的工具,如何通知用戶「沒有互聯網」? – Simon

+1

如果主動/永久連接非常重要,我有時會將工具欄更改爲其他顏色,更改圖標或顯示通知。如果它只是一個加載數據的Recycler/ListView,你應該在那裏顯示消息(使用刷新按鈕),直到它被另一個片段替換。 –

回答

10

UPDATE:如前所述,這是現在可以與Android支持庫22.2.1的版本,使用LENGTH_INDEFINITE標誌

這是不可能使用的正式實施時設置一個小吃吧無限期顯示來自Android設計支持庫。

雖然這樣做可能違反的小吃店的材料設計理念,有第三方小吃吧實現,也讓這一點。這裏有一個例子:

https://github.com/nispok/snackbar

該項目允許以下值顯示的時間:

LENGTH_SHORT: 2s 
LENGTH_LONG: 3.5s (default) 
LENGTH_INDEFINTE: Indefinite; ideal for persistent errors 

要注意的是這個項目不再被開發,由於官方小吃吧的發佈實施。

+1

最近有可能使用支持設計22.2.1最近釋放。 –

40

Android的支持庫(22.2.1)的最新版本,現在包括LENGTH_INDEFINITE

下面將顯示小吃吧,直到它被駁回或另一個小吃吧被示出。

Snackbar.make(view, "Your Snackbar", Snackbar.LENGTH_INDEFINITE) 
     .setAction("Your Action", null).show(); 
0

小吃店會自動從屏幕超時。他們不應該是持久的或堆疊,因爲他們在屏幕上的其他元素。

因此,Snackbars似乎不適合您的用戶通知用戶的用例,直到用戶做了某些事情來解僱它。

相反,你應該考慮使用對話框

對話框總是保留焦點,直到解僱或所需已採取行動

欲瞭解更多信息,請參考:

Material Design Guidelines - Snackbars

Material Design Guidelines - Dialogs

1

我正在使用com.android.support:appcompat-v7:26.1。0Snackbar.LENGTH_INDEFINITE的工作原理應該如此。示例可能如下所示:

private HashMap<Long, Snackbar> mTokenSnackbarMap = new LinkedHashMap<>(); 

private void dropPoint(@NonNull Location location) { 
    final Long token = SystemClock.elapsedRealtime(); 
    // <submitPoint> is the callback to be executed 
    // at a time in the future, if the "cancel" button 
    // of the Snackbar isn't clicked until that time. 
    Runnable submitPoint =() -> { 
     Snackbar bar = mTokenSnackbarMap.get(token); 
     if (bar != null) { 
      // "cancel" button of the Snackbar wasn't clicked, 
      // but our time is up. Dismiss the Snackbar. 
      bar.dismiss(); 
      mTokenSnackbarMap.remove(token); 
      Log.i(TAG, "dropPoint: dismiss snackbar"); 
     } 
     mDatabase.add(Point.Factory.create(uid, location)); 
     Log.i(TAG, "dropPoint: addPoint"); 
    }; 

    // The indefinite Snackbar allowing arbitrary cancellation. 
    Snackbar snackbar = Snackbar.make(mMainView, R.string.point_pending, Snackbar.LENGTH_INDEFINITE) 
     .setAction(R.string.cancel, (v) -> { 
        mTokenSnackbarMap.remove(token); 
        mUiHandler.removeCallbacks(submitPoint, token); 
        Log.i(TAG, "dropPoint: cancel snackbar"); 
       }); 
    mTokenSnackbarMap.put(token, snackbar); 
    mUiHandler.postAtTime(submitPoint, token, 
       SystemClock.uptimeMillis() + Constants.POINT_DELAY_MILLIS); 
    Log.i(TAG, "dropPoint: postAtTime"); 
    snackbar.show(); 
}