Подтвердить что ты не робот

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

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

Например

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

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

4b9b3361

Ответ 1

Основываясь на реализации Snackbar и SnackbarManager, я могу подтвердить оценку Eugene H: это ошибка. От 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 или пользовательская продолжительность в миллисекундах

Ответ 2

Так как 'com.android.support:design:22.2.1'

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

Ответ 3

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

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

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

Ответ 4

Задайте начальную продолжительность для 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();

Ответ 5

Я создал для этого работу, я создал класс, который устанавливает snackbars с пользовательской продолжительностью, используя обработчик и 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);

Ответ 6

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

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

Ответ 7

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