Snackbar в Android - это новый виджет, представленный в библиотеке Material Design в качестве замены Toast ..
Android Snackbar - это легкий виджет, который используется для отображения сообщений в нижней части приложения с включенным смахиванием. Виджет Snackbar для Android может содержать дополнительную кнопку действия.
Разница между тостами и закусками
- Сообщение Toast можно настроить и распечатать в любом месте экрана, но панель Snackbar может отображаться только в нижней части экрана.
- Сообщение Toast не имеет кнопки действия, но Snackbar может иметь кнопку действия по желанию. Однако на Snackbar не должно быть более одной кнопки действия.
- Сообщение Toast нельзя отключить до истечения срока, но Snackbar можно удалить до истечения срока.
Отображение базовой закусочной Android
Прежде всего, вам нужно добавить эти строки в свои зависимости:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.android.support:design:23.0.1' }
Класс Snackbar
предоставляет статические make
методы для создания закусочной, настроенной желаемым образом. Эти методы принимают View
, который будет использоваться для поиска подходящего предка ViewGroup
для отображения закусочной, текстовую строку для отображения (как CharSequence
или идентификатор ресурса) и продолжительность отображения закусочной для (либо заданная длительность или время в миллисекундах). Подходящим предком ViewGroup
будет либо ближайший CoordinatorLayout
к переданному View
, либо корень DecorView
, если его не удалось найти.
Доступные предустановки продолжительности:
View rootView= findViewById(R.id.root_view); Snackbar snackbar = Snackbar.make(rootView, "This is our Snackbar Sample !!", Snackbar.LENGTH_LONG); snackbar.show();
Строки выше показывают вам этот результат:
Теперь у вас есть закусочная!
но мы уже знаем это, это очень просто. Это всего лишь введение…
Нам определенно нужна красивая и отличная закусочная, такая как приложение Twitter или Gmail, с радиусом границы, и я выбираю, какой цвет я хочу установить в фоновый режим и т.д…:
Сделай свой собственный снэк-бар
Итак…
Нам нужно создать класс, который я назвал «SnackBarHelper», с конструктором и получить два параметра на входе:
public class SnackBarHelper { public static void configSnackbar(Context context, Snackbar snack) { } }
Тень
Чтобы установить высоту для нашей закусочной, мы должны добавить эту строку:
public class SnackBarHelper { public static void configSnackbar(Context context, Snackbar snack) { ViewCompat.setElevation(snack.getView(), 6f); } }
У него два параметра, первый - это вид Snack, к которому мы можем получить доступ через закусочную, второй - это высота.
Маржа
нам нужно установить маржу для нашей закусочной, чтобы она выглядела лучше, поэтому мы используем эту функцию
private static void addMargins(Snackbar snack) { ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) snack.getView().getLayoutParams(); params.setMargins(12, 12, 12, 12); snack.getView().setLayoutParams(params); }
Установить Drawable
В некоторых случаях мы хотим внести наши собственные изменения, например, цвет фона радиуса границы и т. Д.
Шаг 1. Сделайте чертеж доступным (R.drawable.contianer_snackbar)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#323232" /> <corners android:radius="4dp" /> </shape>
Шаг 2. Функция
private static void setDrawable (Context context, Snackbar snackbar){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { snackbar.getView().setBackground(context.getDrawable(R.drawable.contianer_snackbar)); } }
Изменение шрифта SnackBar (Установить TypeFace)
Я использую свой собственный шрифт, который находится в папке с моими ресурсами:
private static void setTypeFace(Context context, Snackbar snackbar) { TextView tv = (snackbar.getView()).findViewById(com.google.android.material.R.id.snackbar_text); TextView snackbarActionTextView = snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_action ); Typeface font = Typeface.createFromAsset(context.getAssets(),"fonts/IranSansRegular.ttf"); Typeface bold =Typeface.createFromAsset(context.getAssets(), "fonts/IranSansMedium.ttf"); tv.setTypeface(font); snackbarActionTextView.setTypeface(bold); }
Добавление действия
Чтобы добавить действие, используйте метод setAction
для объекта, возвращенного из make
. Действия требуют как текст для отображения, так и OnClickListener
для обработки щелчков по действию. Закусочные автоматически закрываются при нажатии на действие.
Показ закусочной с сообщением и действием будет выглядеть так:
Snackbar.make(contextView, R.string.item_removed_message, Snackbar.LENGTH_LONG).setAction(R.string.undo, new OnClickListener() { @Override public void onClick(View v) { // Respond to the click, such as by undoing the modification that caused // this message to be displayed }) });
Цвет текста действия можно настроить с помощью setActionTextColor
методов (по умолчанию используется цвет акцента вашей темы).
Цвет действия
private static void changeActionTextColor(Snackbar snackbar , Context context) { snackbar.setActionTextColor(context.getResources().getColor(R.color.colorWhite)) }
В конце концов, вам нужно добавить все эти функции в свой конструктор.
SnackBarHelper.class
public class SnackBarHelper { public static void configSnackbar(Context context, Snackbar snack) { addMargins(snack); setRoundBordersBg(context, snack); setTypeFace(context, snack); setToRtl(snack); ViewCompat.setElevation(snack.getView(), 6f); changeActionTextColor(snack , context); } private static void setToRtl(Snackbar snackbar) { ViewCompat.setLayoutDirection(snackbar.getView(), ViewCompat.LAYOUT_DIRECTION_RTL); } private static void changeActionTextColor(Snackbar snackbar , Context context) { snackbar.setActionTextColor(context.getResources().getColor(R.color.colorWhite)); } private static void addMargins(Snackbar snack) { ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) snack.getView().getLayoutParams(); params.setMargins(12, 12, 12, Funcations.SnackMargin); snack.getView().setLayoutParams(params); } private static void setRoundBordersBg(Context context, Snackbar snackbar) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { snackbar.getView().setBackground(context.getDrawable(R.drawable.contianer_snackbar)); } } private static void setTypeFace(Context context, Snackbar snackbar) { TextView tv = (snackbar.getView()).findViewById(com.google.android.material.R.id.snackbar_text); TextView snackbarActionTextView = snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_action ); Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/IranSansRegular.ttf"); Typeface bold = Typeface.createFromAsset(context.getAssets(), "fonts/IranSansMedium.ttf"); tv.setTypeface(font); snackbarActionTextView.setTypeface(bold); } }
Слушатель клавиатуры
Иногда Snackbar прячется за клавиатурой и не виден Я написал эту функцию, чтобы решить эту проблему: когда клавиатура открывается, она заметит высоту клавиатуры и сохранит ее в переменной. Теперь у вас есть высота клавиатуры и все, что у вас есть. сделать, это использовать его в качестве поля снизу:
public static boolean isKeyboardHidden = false; public static int SnackMargin = 12; public static void keyBoardListener(final Activity activity) { final View activityRootView = activity.findViewById(android.R.id.content); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); activityRootView.getWindowVisibleDisplayFrame(rect); int heightRoot = activityRootView.getRootView().getHeight(); int heightDiff = heightRoot - rect.bottom; Log.d("heightRoot", heightRoot + ""); Log.d("heightDiff", heightDiff + ""); if (heightDiff > dpToPx(activity, 200)) { if (!isKeyboardHidden) { isKeyboardHidden = true; SnackMargin = heightDiff + 15; } } else if (heightDiff < dpToPx(activity, 200)) { if (isKeyboardHidden) { isKeyboardHidden = false; SnackMargin = 12; } } } }); }
Чтобы использовать эту функцию, вы должны вызвать ее в любом действии, которое вы хотите показать закусочной, и использовать переменную «snakeMargin» для поля снизу, поэтому я изменяю свою функцию поля, которую я написал для этого:
private static void addMargins(Snackbar snack) { ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) snack.getView().getLayoutParams(); params.setMargins(12, 12, 12, snackMargin);//it will set margin to bottom snack.getView().setLayoutParams(params); }
в своей деятельности для демонстрации закусочной я использую это:
Snackbar snack = Snackbar.make( activity.findViewById(android.R.id.content),message, Snackbar.LENGTH_LONG); SnackBarHelper.configSnackbar(activity, snack); snack.show();
Теперь у вас есть это:
Спасибо ! ❤
Здесь очень плохая ситуация! Да, я имею в виду Иран…
Люди все грустят, я тоже
Но мир по-прежнему прекрасен :)
IG: www.instagram.com/behnamnasehi
Gmail: [email protected]
Telegram: @Behnamnasehii