Как использовать метод setDuration() в SnackBar (библиотека поддержки дизайна Android)

Из документации: длительность параметра - либо одна из предопределенных длин: LENGTH_SHORT, LENGTH_LONG, либо пользовательская длительность в миллисекундах. Но я не могу установить пользовательскую продолжительность.

Например

Snackbar
    .make(parentLayout, "Feed cat?", 8000) // try here
    .setAction("Yes", snackOnClickListener)
    .setActionTextColor(Color.MAGENTA)
    .setDuration(8000) // try here
    .show();

но вместо 8 секунд снэкбар ушел быстро.

8 ответов

На основании реализации Snackbar а также SnackbarManagerЯ могу подтвердить оценку Юджина Н. Это ошибка. От SnackbarManager:

private void scheduleTimeoutLocked(SnackbarRecord r) {
    mHandler.removeCallbacksAndMessages(r);
    mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_TIMEOUT, r),
            r.duration == Snackbar.LENGTH_LONG
                    ? LONG_DURATION_MS
                    : SHORT_DURATION_MS);
}

Таким образом, любое значение, которое не LENGTH_LONG приводит к краткосрочной закусочной.

Я подал вопрос об этом.

Редактировать: Исправлено в ревизии 22.2.1. Проверьте заметки о выпуске здесь

Документы по Android еще не были обновлены, но если вы перейдете в исходный код, вы заметите, что параметром метода setDuration(int duration) может быть либо LENGTH_SHORT, LENGTH_LONG, LENGTH_INDEFINITE, либо пользовательская длительность в миллисекундах

Установите начальную продолжительность LENGTH_INDEFINITE, а затем установите свою собственную длительность впоследствии:

Snackbar
.make(parentLayout, "Feed cat?", Snackbar.LENGTH_INDEFINITE)
.setAction("Yes", snackOnClickListener)
.setActionTextColor(Color.MAGENTA)
.setDuration(8000)
.show();

РЕДАКТИРОВАТЬ

Установка периода непосредственно в миллисекундах теперь работает;

Snackbar
.make(parentLayout, "Feed cat?", 8000)
.setAction("Yes", snackOnClickListener)
.setActionTextColor(Color.MAGENTA)
.show();

Поскольку 'com.android.support:design:22.2.1'

Вы можете установить продолжительность вашего Snackbar в LENGTH_INDEFINITEон будет отображать снэк-бар до тех пор, пока он не будет удален или пока не появится другой снэк-бар.

Этот код работает отлично для меня, попробуйте это

Snackbar.make(view, "Hello SnackBar", Snackbar.LENGTH_LONG)
        .setAction("Its Roy", new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        })
        .setDuration(10000)
        .setActionTextColor(getResources().getColor(R.color.colorAccent))
        .show();

Кажется, это исправлено в

compile 'com.android.support:design:22.2.1'

Только Lint показывает красный подчеркнутый, но это работает.

Я создал обходной путь для этого, я создал класс, который устанавливает закусочные с пользовательской продолжительностью, используя обработчик и postDelayed:

public class SnackBarMaker {

public static void snack(View content, String message, String actionText,  int actionTextColor, View.OnClickListener onClick){
    Snackbar.make(content, message, Snackbar.LENGTH_LONG)
            .setAction(actionText, onClick)
            .setActionTextColor(actionTextColor)
            .show();
}

public static void snackWithCustomTiming(View content, String message, int duration){
    final Snackbar snackbar = Snackbar.make(content, message, Snackbar.LENGTH_INDEFINITE);
    snackbar.show();
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            snackbar.dismiss();
        }
    },duration);
}
}

использовать как это:

  //your duration
   int duration = 4000 
SnackBarMaker.snackWithCustomTiming(getActivity().findViewById(android.R.id.content)
                                               , getString(R.string.your_message), duration);

Здравствуйте, попробуйте эту внешнюю библиотеку https://github.com/nispok/snackbar. Это устарело, но это легко решит вашу проблему. Кроме того, это легко реализовать. До поддержки библиотеки я использовал эту библиотеку только для закусочных. Из-за проблемы длительности поддержки библиотеки, я рад использовать только эту библиотеку.

В 2022 году с AndroidX это решение все еще актуально: /questions/2518085/kak-ispolzovat-metod-setduration-v-snackbar-biblioteka-podderzhki-dizajna-android/2518097#2518097

Просто установите продолжительность в мс непосредственно наmakeфункция:

      Snackbar.make(context, messageId, DISMISS_TIMEOUT)
        .setAction(actionId, actionListener)
        .addCallback(dismissCallback)
        .show()

const val DISMISS_TIMEOUT = 6000

Кроме того, я сделал некоторые расчеты и выяснил значения длительности по умолчанию :

  • Snackbar.LENGTH_LONG~ 3000 мс
  • Snackbar.LENGTH_SHORT~ 2000 мс
Другие вопросы по тегам