Как использовать метод 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 мс