2015-06-27 3 views
15

Я вижу, что Snackbar будет принимать только LENGTH_LONG или LENGTH_SHORT при определении длины его отображения на экране.Android Support Library Snackbar с неопределенной длиной

Я бы хотел, чтобы он отображался до тех пор, пока кто-то не вытащит его из экрана. Это касается некоторых случаев, когда у вас есть постоянные ошибки, например, когда у вас нет интернета, и вы хотите уведомить пользователя, не покидая экран после 2750 мс при выборе LENGTH_LONG.

Конечно, я могу использовать setDuration для смехотворно длинных миллисекундных значений, но не существует способа просто настроить его так, чтобы он не исчез, пока пользователь не отклонит его?

+2

Следует отметить, что в Руководящих принципах Material Design указано, что Snackbars являются элементами переходного режима. Это означает, что они ни в коем случае не должны застревать на экране, потому что они блокируют другие элементы на экране. –

+0

Согласованный и хороший момент. Считаете ли вы, что интернет-сообщение не должно строиться внутри представления на моем пользовательском интерфейсе? Как уведомить пользователя о «отсутствии Интернета», если закусочные не являются подходящими инструментами? – Simon

+1

Если активное/постоянное соединение действительно важно, я иногда меняю панель инструментов на другой цвет, меняю значок или показываю уведомление. Если это только Recycler/ListView, который загружает данные, вы должны просто показать там сообщение (с кнопкой обновления), пока оно не будет заменено другим фрагментом. –

ответ

10

UPDATE: Как уже упоминалось, это стало возможным с выходом библиотеки поддержки Android 22.2.1, используйте флаг LENGTH_INDEFINITE

Это не представляется возможным установить бессрочный отображение закусочной при использовании официальной реализации из библиотеки поддержки Android Design.

Хотя это может нарушить философию дизайна материалов в закусочной, есть сторонние реализации Snackbar, которые позволяют это. Вот пример:

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.0 и Snackbar.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(); 
} 
Смежные вопросы