Android bottomsheetdialogfragment transparent background

BottomSheetDialogFragment с анимацией при смене состояния и sticky button

Почти каждый андройд разработчик сталкивался с BottomSheetBehavior, но гораздо реже требуется не просто показать BottomSheet, а ещё и добавить анимации, либо пригвоздить какой-то из элементов при раскрытии.
Недавно я столкнулся с такой задачей, реализовал её и решил составить небольшой туториал, который может помочь сэкономить время.

На данной гифке показано, что мы увидим в конце туториала:

Что нужно знать:

Как создать проект и запустить его

Поверхностное понимание что такое BottomSheetDialogFragment и BottomSheetBehavior

Поверхностное понимание что такое LayoutParams

ViewBinding(можно обойтись без него и использовать обычные findViewById)

Первый этап

На первом этапе мы сделаем смену контента в BottomSheetDialogFragment, визуализировав это fading эффектом.

Создадим в папке drawable файл под именем bottom_sheet_background.xml, в котором опишем background для нашего фрагмента, выставив цвет фона и закруглённые углы

Далее опишем стиль для нашего фрагмента в файле styles.xml в папке values

Создадим файл bottom_sheet_layout.xml с разметкой для нашего фрагмента, в комментариях в xml расписано назначение каждого элемента.

В разметке мы имеем одну ViewGroup, которая будет в обоих стейтах и не будет изменяться, и две отдельных ViewGroup для состояний collapsed и expanded.

При вытягивании фрагмента первая будет исчезать и в определённый момент будет заменена второй.

Мы можем перейти к созданию самого фрагмента.

Создадим класс BottomFragment, унаследовав его от BottomSheetDialogFragment

Полный код BottomFragment

Обратим внимание на ключевые моменты

Мы получаем BottomSheetBehavior, выставляем ему peekHeight и вешаем на него слушателя

В методе onSlide() в зависимости от оффсета мы меняем прозрачность наших двух layout и в определённый момент меняем их видимость

Коэффициент 0.5 можно заменить на какой-либо другой и тогда исчезание и появление будет происходить раньше или позже

Вызовем наш фрагмент. Чтобы сделать это быстрее и не добавлять новые кнопки и слушатели, сделаем это прямо из метода onCreate() в MainActivity

Можем запускать наш проект. Мы увидим вот такое поведение:

Второй этап

На данном этапе мы добавим sticky кнопку внизу нашего фрагмента. Для этого мы программно добавим view к нашему экрану.

Сперва создадим layout файл button.xml с кнопкой

Далее программно добавим кнопку к нашему фрагменту, вставив этот код между установкой behavior.state и добавлением коллбека behavior.addBottomSheetCallback

Читайте также:  Root права андроид fly

Мы программно надуваем и добавляем наш layout с кнопкой к родительскому layout

Вместо кнопки мы можем начинить наш layout любыми другими view

Запустив проект мы увидим следующее:

Полный финальный код

Заключение

Данное решение не претендует на истинно верное.

Вероятно, есть более красивые способы сделать это, я буду рад узнать о таких!

Вы можете экспериментировать с размерами, константами и тд, чтобы подгонять этот подход под вашу ситуацию.

Спасибо за внимание! Буду рад замечаниям и предложениями.

Источник

BottomSheetDialog с прозрачным фоном

Я хотел бы отобразить диалоговое окно нижнего листа менее широким, чем ширина экрана.

например, опция Share от Google Play Music на Nexus 9.

знаете ли вы, как этого достичь ?

на данный момент мне просто удалось уменьшить ширину содержимого листа, но фон по-прежнему находится на ширине экрана и отображает белый фон.

6 ответов

это самое простое решение для установки прозрачного фона BottomSheetDialogFragment

((View) contentView.getParent()).setBackgroundColor(getResources().getColor (android.Цвет р..прозрачный));

это работает для меня при использовании BottomSheetDialogFragment :

также добавьте это в свой styles.xml

Итак, я придумал 2 решения.

лучший:

создайте действие с прозрачным фоном только для вашего нижнего листа. Реализуйте свой собственный макет с макетом координатора и нижним листом. Установите маржу, которую вы хотите. Установите нужный контент.

еще не проверял.

ленивый:

выходит BottomSheetDialogFragment, в onActivityCreated добавить:

бит взлома, но он работает для создания фона прозрачным. Очевидно, что вы можете заменить «прозрачный» на любой цвет, который вы хотите.

вот ваш ответ: D

и android:layout_width=»100dp» in nestedScroolView to android:layout_width=»match_parent»

Источник

Русские Блоги

Использование BottomsheetDialogFragment в разработке Android

Использование BottomsheetDialogFragment для разработки под Android

BottomSheetDialogFragment наследует от AppCompatDialogFragment, официальная интерпретация — модальная нижняя таблица, является версией DialogFragment, она использует BottomSheetDialog вместо плавающего диалога. BottomSheetDialogFragment имеет следующие преимущества перед другими диалоговыми окнами:

1. иметь свой жизненный цикл;
2. Всю страницу можно сложить, развернуть и уничтожить;
3. Настраиваемые стили можно использовать гибко.

Наследование классов

Анализ исходного кода

Родительским классом BottomSheetDialogFragment является AppCompatDialogFragment, который переопределяет метод onCreateDialog () и возвращает экземпляр BottomSheetDialog. Форма темы диалога происходит из метода getTheme (), а getTheme () является открытым методом DialogFragment.
Введите исходный код BottomSheetDialog, загрузка диалога происходит в setContentView ():


и в методе onStart:

Следовательно, переопределение этого метода может определить начальное состояние BottomSheetDialog.

Макет, стиль

Под пакетом дизайна мы находим design_bottom_sheet_dialog.xml следующим образом:

Как видно из вышесказанного, контейнер для загрузки диалогового окна — это «design_bottom_sheet», который определяет стиль.

Мы можем настроить стиль BottomSheetDialog, настроив следующую тему: bottomSheetStyle, Ctrl + щелчок, чтобы ввести стиль, а затем выполнить поиск «bottomSheetStyle» в открытом файле. Отображение выглядит следующим образом:

Как видно из рисунка, он указан в «@ style / Widget.Design.BottomSheet.Modal», продолжайте ввод и обнаружите, что он содержит следующие атрибуты:

Очевидно, что атрибут background определяет цвет фона диалогового окна, поэтому мы можем переопределить эти атрибуты следующим образом (note parent = ”android: Widget”):

Инкапсуляция базового класса

С помощью приведенного выше анализа мы можем инкапсулировать базовый класс для облегчения последующего использования.

При его использовании просто переписайте метод onViewCreated (представление @NonNull, @Nullable Bundle saveInstanceState) и введите свой собственный диалоговый интерфейс:

Читайте также:  Только зарядка по юсб андроид

Это может быть закрыто Поведением:

Установите смещение сверху, когда оно полностью развернуто:

Эффект предварительного просмотра

Полностью расширен без верхнего смещения:

Полностью расширен с верхним смещением 200:

Из-за небольшого пространства, исходный код не будет загружен в Github в настоящее время, эта статья будет постоянно обновляться.

Источник

BottomSheetDialog с прозрачным фоном

Я хотел бы отобразить диалоговое окно нижнего листа менее широким, чем ширина экрана.

Например, опция «Поделиться» из Google Play Music на Nexus 9.

Вы знаете, как этого добиться?

Пока я только что уменьшил ширину содержимого листа, но фон все еще остается на ширине экрана и отображает белый фон.

20 ответов

Итак, я разобрался с 2 решениями.

Лучший:

Создайте занятие с прозрачным фоном только для нижнего листа. Реализуйте свой собственный макет с координатным макетом и нижним листом. Установите поле, которое вы хотите. Установите контент, который вы хотите.

Еще не проверено.

Ленивый

Расширяет BottomSheetDialogFragment, в onActivityCreated добавлять:

Это сработало для меня при использовании BottomSheetDialogFragment :

Также добавьте это в свой styles.xml

Это простейшее решение для установки прозрачного фона BottomSheetDialogFragment

((Просмотреть) contentView.getParent()). SetBackgroundColor(getResources(). GetColor(android.R.color.transparent));

Извините, получил поздно, вот то, что вы ищете upvote, если вы сделали это успешно

Добавить эту строку — фрагмент диалога нижнего листа.

Следующее переопределение функции сработало в BottomSheetDialogFragment реализация:

Немного взломать, но это работает, чтобы сделать фон прозрачным. Очевидно, вы можете заменить «прозрачный» любым цветом, который вы хотите.

Есть несколько хакерских способов сделать это. Я решил эту проблему рекомендованным способом. Давайте разберемся, почему?

В документации упоминается, что

Модальный нижний лист. Это версия DialogFragment, которая показывает нижний лист с помощью BottomSheetDialog вместо плавающего диалогового окна.

Это означает, что должен быть метод, который используется для замены значения по умолчанию Dialog с а.

Единственное переопределение метода — это. Итак, мы собираемся использовать этот общедоступный метод, чтобы переопределить наш стиль диалога.

Рекомендуемый метод

Во фрагменте, расширяющем overrDide onCreateDialog() который представляет собой открытый метод.

кроме того, в themes.xml переопределить тему и добавить прозрачный фон.

  • BottomSheetDialogFragment : здесь
  • onCreateDialog : здесь
  • тематика BottomSheetDialog : здесь

Следуя идее Marco RS (для меня это было единственное решение, которое вообще работало), вы можете создать чистое расширение и применять в своих диалогах где угодно.

У меня была такая же проблема, ничего не помогло. Использовал этот код для решения проблемы:

PS com.google.android.material: материал:1.1.0-alpha09

Поздний ответ, но сам столкнулся с этой проблемой и нашел лучшее решение, чем любой из предложенных.

Вы можете обернуть свой макет листа другим макетом с прозрачным фоном и добавить к нему поле (16dp здесь):

Затем добавьте прозрачный фон на свой лист, как в ответе Gnzlt:

И вуаля, не нужно другое занятие.

Это сработало для меня.. Oncreate Dialog получить цвет окна

используйте «setOnShowListener» для вашего экземпляра диалога, как это в kotlin:

полный код на котлине:

Это твой ответ:D

а также изменить android:layout_width=»100dp» in nestedScroolView в android:layout_width=»match_parent»

1. Сначала добавьте стиль в свою тему:

2. Затем прикрепите указанный выше стиль с помощью BottomSheetDialogFragment, как показано ниже:

Я знаю, что это старый вопрос, но я все еще отвечаю на него и надеюсь, что он будет полезен. По умолчанию макет, указанный в onCreateView() метод будет добавлен в FrameLayout with white background — пользователем BottomSheetDialogFragment . Для этого вы должны установить прозрачный фон FrameLayout в onStart() метод.

Читайте также:  Форсаж гонки для андроид

BottomSheetDialog получит R.attr.bottomSheetDialogTheme стиль из темы вашего контекста или используйте значение по умолчанию R.style.Theme_Design_Light_BottomSheetDialog .

XML-макет BottomSheetDialog — R.layout.design_bottom_sheet_dialog. Основное содержимое — это FrameLayout с id / design_bottom_sheet, стиль которого ?attr/bottomSheetStyle .

Если вы расширяете стиль с помощью родительского Theme.Design.Light.BottomSheetDialog тогда все ваши атрибуты по умолчанию, такие как colorPrimary , colorAccent может быть отменено. Таким образом, рекомендуется использовать ThemeOverlay в дереве тем просмотра. Вы должны расширить стиль от ThemeOverlay.MaterialComponents.Light.BottomSheetDialog как это:

Вы должны расширить стиль от Widget.MaterialComponents.BottomSheet.Modal , потому что стиль по умолчанию содержит:

Фон BottomSheetDialog определяется как android:background а также backgroundTint . Но я не уверен, почему backgroundTint эффективен, когда android: background имеет значение null. 🤔??

Для получения дополнительных сведений о теме Android:

Источник

BottomSheetDialogFragment bottom navigation color #267

Comments

Zeliret commented Jan 17, 2019

I have tried to apply a custom color to the bottom navigation bar but failed.
I tried this:

It works for usual DialogFragment but not for the BottomSheetDialogFragment.

I tried this also:

How can I change the nagivation bar color to custom? Right now it is always transparent.

The text was updated successfully, but these errors were encountered:

artnest commented Jan 30, 2019

mtrewartha commented Mar 8, 2019

@Zeliret Did you manage to figure this one out, by chance? No matter what I do, I still get the transparency on top of my usually white navigation, which looks pretty wonky. Tried everything in the above Medium article, too 🤷‍♂️

ivaniskandar commented Mar 9, 2019 •

My solution for this is by having my own bottom sheet style and applying it by overriding the getTheme() method:

I’m yet to try making the navbar transparent and making the actual bottom sheet draws under the navbar, but that one is working for now.

iFr0z commented Jun 27, 2019

@ivaniskandar Big thx! You save my time 🙂

touficbatache commented Sep 1, 2019

This needs to be fixed!

laurencedawson commented Mar 11, 2020

Also facing this issue.

hedvigoscar commented Mar 16, 2020

Experiencing this issue as well.

johnmalatras commented Sep 3, 2020

SwordBearer commented Sep 10, 2020

thanks @ivaniskandar , it worked!

SamYStudiO commented Oct 7, 2020 •

Any idea how to have bottom navigation bar white transparent like system share dialog? I mean we can see a bit of content behind navigation bar while scrolling?

I tried
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
but this does nothing

LouisCAD commented Oct 7, 2020

@SamYStudiO You can use this Kotlin extension:

stephentalley commented Oct 15, 2020

There’s no need to override an entire theme, or change any of your Java/Kotlin code. Just set the appropriate theme overlay in your app theme:

Источник

Оцените статью