Как использовать метод 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 ушла быстро.
Ответы
Ответ 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. Из-за проблемы продолжительности поддержки библиотеки поддержки, я рад использовать эту библиотеку только.