Snackbar не позволяет вам устанавливать собственный макет. Однако, как предположил Primoz990, вы можете получить представление Snackbar's View. Функция getView возвращает Snackbar.SnackbarLayout, который представляет собой горизонтальный объект LinearLayout, дочерними элементами которого являются TextView и Button. Чтобы добавить свое собственное представление в Snackbar, вам просто нужно скрыть TextView и добавить свое представление в Snackbar.SnackbarLayout.
// Create the Snackbar
Snackbar snackbar = Snackbar.make(containerLayout, "", Snackbar.LENGTH_LONG);
// Get the Snackbar's layout view
Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
// Hide the text
TextView textView = (TextView) layout.findViewById(android.support.design.R.id.snackbar_text);
textView.setVisibility(View.INVISIBLE);
// Inflate our custom view
View snackView = mInflater.inflate(R.layout.my_snackbar, null);
// Configure the view
ImageView imageView = (ImageView) snackView.findViewById(R.id.image);
imageView.setImageBitmap(image);
TextView textViewTop = (TextView) snackView.findViewById(R.id.text);
textViewTop.setText(text);
textViewTop.setTextColor(Color.WHITE);
//If the view is not covering the whole snackbar layout, add this line
layout.setPadding(0,0,0,0);
// Add the view to the Snackbar's layout
layout.addView(snackView, 0);
// Show the Snackbar
snackbar.show();
Возможно, начиная с версии 25.1.0 библиотеки поддержки Android.
I. Объявите пользовательский макет в папке значений / макета.
Подсказки:
@dimen/design_snackbar
значения в соответствии с рекомендациями по дизайну материалов.?attr/colorAccent
чтобы применить изменения темы приложения к Snackbar.II. Расширить класс BaseTransientBottomBar .
III. Добавить BaseTransientBottomBar.ContentViewCallback
IV. Добавить метод создания Snackbar с настраиваемым макетом и методами его заполнения.
V. Создайте экземпляр
CustomSnackbar
и вызовитеshow()
метод.Узнайте больше о Snackbar и его настройке на сайте materialdoc.com.
Полный
CustomSnackbar.class
код:источник
Способ XML:
Исходный XML-файл макета, который используется для
Snackbar
этого файла:design_layout_snackbar_include.xml
:Итак, чтобы переопределить этот макет, вы должны написать свой собственный макет с теми же
android:id
s, что и в этом, и в свойrefs.xml
файл вы должны добавить эту строку:источник
BaseTransientBottomBar
, за stackoverflow.com/a/41154330/9636Ответ: не настраивайте Snackbar. Он не должен содержать больше элементов, чем короткий текст и одно действие. См. Рекомендации Google по дизайну материалов .
ОБНОВЛЕНИЕ: если вы все равно хотите настроить Snackbar, вот что я реализовал в своем приложении:
Я никогда не пробовал, но с получением корневого представления Snackbar вы могли программно добавлять новые представления на Snackbar.
источник
В onCreate действия:
источник
Я попробовал и работает!
источник
Попробуйте следующий код.
Примечание:
источник
Чтобы добавить к ответу Якива Моспана, чтобы сделать свое настраиваемое
BaseTransientBottomBar
шоу снизу, как aSnackbar
, скопируйте этот метод изSnackbar
класса, чтобы найти подходящего родителя дляBaseTransientBottomBar
конструктора.источник
Версия Kotlin для принятого ответа: https://stackoverflow.com/a/33441214/2437655
источник
Вот мой код класса util для kotlin: https://gist.github.com/Ryszardenko/db429bc7d177e646ffe27e0672a0958c#file-customsnackbar-kt
cancelFun () - это лямбда, по умолчанию пустая - вы можете передать туда, например, функцию «отменить».
источник
Вы можете попробовать эту библиотеку. Это оболочка для снекбара по умолчанию для Android. https://github.com/ChathuraHettiarachchi/CSnackBar
или вы даже можете использовать свой собственный вид,
В настоящее время единственная проблема с настраиваемым макетом заключается в том, что нам нужно передать высоту представления в dp в качестве ввода
источник