Snackbar в Android - это новый виджет, представленный в библиотеке Material Design в качестве замены Toast ..

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

Разница между тостами и закусками

  1. Сообщение Toast можно настроить и распечатать в любом месте экрана, но панель Snackbar может отображаться только в нижней части экрана.
  2. Сообщение Toast не имеет кнопки действия, но Snackbar может иметь кнопку действия по желанию. Однако на Snackbar не должно быть более одной кнопки действия.
  3. Сообщение 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