Круглий кут для BottomSheetDialogFragment


112

у мене є спеціальний BttomSheetDialogFragment, і я хочу мати круглі кути вгорі внизу

це мій спеціальний клас, який роздуває мій макет, який я хочу відображати знизу

View mView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.charge_layout, container, false);
    initChargeLayoutViews();
    return mView;
}

а також у мене є цей файл ресурсу xml як тло:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners android:topRightRadius="35dp"
    android:topLeftRadius="35dp"
    />
<solid android:color="@color/white"/>

<padding android:top="10dp"
    android:bottom="10dp"
    android:right="16dp"
    android:left="16dp"/>

але проблема в тому, що коли я встановлюю цей файл ресурсу як фон кореневого елемента мого макета, кути все ще не округляються

і я не можу використовувати код нижче:

    this.getDialog().getWindow().setBackgroundDrawableResource(R.drawable.charge_layout_background);

Тому що його перевизначення фоном за замовчуванням BottomSheetDialog і над моїм нижнім видом не буде будь-якого напівпрозорого сірого кольору


5
@RasoolGhana - Загляньте за цим посиланням: medium.com/halcyon-mobile/…
Мохіт Чарадва

Відповіді:


231

Створіть власний малювальник rounded_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/white"/>
    <corners android:topLeftRadius="16dp"
        android:topRightRadius="16dp"/>

</shape>

Потім перевизначення bottomSheetDialogThemeна styles.xmlвикористання витяжки в якості фону:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">       
    <item name="bottomSheetDialogTheme">@style/AppBottomSheetDialogTheme</item>
</style>

<style name="AppBottomSheetDialogTheme"
    parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/AppModalStyle</item>
</style>

<style name="AppModalStyle"
    parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@drawable/rounded_dialog</item>
</style>

Це змінить усі діалогові вікна BottomSheetDialog у вашому додатку.


2
Це працює для мене. Також я помітив, що це залежить від кореневого елемента макета. Спочатку у мене був перегляд картки як кореневий (бо я спробував інший спосіб закруглити кути), потім я змінив його на лінійний макет, і тепер він працює чудово
Іван Шафран

1
Аварії на android api 17
Morteza Rastgoo

1
Я б не використовував rounded_dialog& AppModalStyleімена з фоном, де лише верхні кути закруглені, оскільки ви очікували б використовувати такий фон із стилем нижнього аркуша. Як щодо bottomsheet_rounded_background&AppBottomSheetStyle
hmac

3
Зверніть увагу, що якщо ви вказали фон у кореневому поданні, це замінить це налаштування
hmac

2
переконайтеся, що у вас немає жодного фону на кореневому елементі вашого макета аркуша!
MMK

81

За допомогою нової бібліотеки компонентів матеріалів ви можете налаштувати форму компонента, використовуючи shapeAppearanceOverlayатрибут у вашому стилі ( Примітка: для цього потрібна версія 1.1.0 )

Просто скористайтеся BottomSheetDialogFragmentпереважним onCreateViewметодом, а потім визначте власний стиль для діалогів нижнього аркуша.

Визначте bottomSheetDialogThemeатрибут у styles.xmlтемі програми:

  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.MaterialComponents.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    ....
    <item name="bottomSheetDialogTheme">@style/CustomBottomSheetDialog</item>
  </style>

Тоді просто визначте свою улюблену форму за допомогою shapeAppearanceOverlay

  <style name="CustomBottomSheetDialog" parent="@style/ThemeOverlay.MaterialComponents.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/CustomBottomSheet</item>
  </style>

  <style name="CustomBottomSheet" parent="Widget.MaterialComponents.BottomSheet">
    <item name="shapeAppearanceOverlay">@style/CustomShapeAppearanceBottomSheetDialog</item>
  </style>

  <style name="CustomShapeAppearanceBottomSheetDialog" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSizeTopRight">16dp</item>
    <item name="cornerSizeTopLeft">16dp</item>
    <item name="cornerSizeBottomRight">0dp</item>
    <item name="cornerSizeBottomLeft">0dp</item>
  </style>

введіть тут опис зображення


Ви можете отримати таку ж поведінку, перевизначивши цей метод у вашому BottomSheetDialogFragment(замість того, щоб додавати тему bottomSheetDialogThemeу вашій програмі):

@Override public int getTheme() {
    return R.style.CustomBottomSheetDialog;
  }

У цьому випадку ви використовуєте цей themeOverlay лише в одному, BottomSheetDialogFragmentа не у всій програмі.


Важлива примітка про РОЗШИРЕНУ ДЕРЖАВУ :

У розгорнутому стані BottomSheet має плоскі кути . Ви можете перевірити офіційний коментар у репозиторії github :

Наша команда дизайнерів твердо переконана, що закруглені кути вказують на прокручуваний вміст, тоді як плоскі кути вказують на відсутність додаткового вмісту. Таким чином, вони не хочуть, щоб ми додавали цю зміну за допомогою fitToContents.

Така поведінка забезпечується BottomSheetBehaviorі неможливо її замінити.
Однак є обхідне рішення -> ВІДМОВА: це може перестати працювати в наступних випусках !!

Ви можете додати a BottomSheetCallbackв BottomSheetDialogFragment:

  @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);


    ((BottomSheetDialog)dialog).getBehavior().addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {

      @Override public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_EXPANDED) {
          //In the EXPANDED STATE apply a new MaterialShapeDrawable with rounded cornes
          MaterialShapeDrawable newMaterialShapeDrawable = createMaterialShapeDrawable(bottomSheet);
          ViewCompat.setBackground(bottomSheet, newMaterialShapeDrawable);
        }
      }

      @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) {

      }
    });

    return dialog;
  }

  @NotNull private MaterialShapeDrawable createMaterialShapeDrawable(@NonNull View bottomSheet) {
    ShapeAppearanceModel shapeAppearanceModel =

      //Create a ShapeAppearanceModel with the same shapeAppearanceOverlay used in the style
      ShapeAppearanceModel.builder(getContext(), 0, R.style.CustomShapeAppearanceBottomSheetDialog)
        .build();

      //Create a new MaterialShapeDrawable (you can't use the original MaterialShapeDrawable in the BottoSheet)
      MaterialShapeDrawable currentMaterialShapeDrawable = (MaterialShapeDrawable) bottomSheet.getBackground();
      MaterialShapeDrawable newMaterialShapeDrawable = new MaterialShapeDrawable((shapeAppearanceModel));
      //Copy the attributes in the new MaterialShapeDrawable
      newMaterialShapeDrawable.initializeElevationOverlay(getContext());
      newMaterialShapeDrawable.setFillColor(currentMaterialShapeDrawable.getFillColor());
      newMaterialShapeDrawable.setTintList(currentMaterialShapeDrawable.getTintList());
      newMaterialShapeDrawable.setElevation(currentMaterialShapeDrawable.getElevation());
      newMaterialShapeDrawable.setStrokeWidth(currentMaterialShapeDrawable.getStrokeWidth());
      newMaterialShapeDrawable.setStrokeColor(currentMaterialShapeDrawable.getStrokeColor());
      return newMaterialShapeDrawable;
  }

2
@GabrieleMariotti, використовуючи цю техніку, якщо я натискаю десь на аркуші, і його не відкидають, кути анімують. Я не впевнений, що ви розробляєте компоненти Android, але якщо ви знаєте, чи знали ви про цю проблему? Я використовував 1.1.0-alpha10, але я також перевірив бета2. Я не впевнений, залежить це від точних поглядів, які я вклав у аркуш чи ні.
androidguy

1
Я повідомив про цю проблему: issuetracker.google.com/issues/144859239 Якщо у кого є якісь - які додаткові висновки або вирішення питання, будь ласка , дайте відповідь. Дякую!
androidguy

4
Я отримую цю помилку та збій у версії 1.1.0-beta02Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
hkchakladar

3
Це не працює, якщо розгорнути діалогове вікно нижнього аркуша. Будь-яка ідея?
Хосе Карлос,

4
Це була ідеальна і остання відповідь. Мені потрібно позначити це як відповідь
Вікас Ачарія,

38

Параметр BottomSheetDialogвстановлює колір білого тла за замовчуванням, саме тому кути не видно. Для їх показу потрібно зробити фон діалогового прозорим, замінивши стиль BottomSheetDialog.

Визначте цей стиль у вашому res/values/styles/styles.xml

<style name="BottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/bottomSheetStyleWrapper</item>
</style>

<style name="bottomSheetStyleWrapper" parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@android:color/transparent</item>
</style>

І встановіть цей стиль для вашого BottomSheetDialog

View view = getLayoutInflater().inflate(R.layout.chooser_bottom_sheet, null);
BottomSheetDialog dialog = new BottomSheetDialog(this,R.style.BottomSheetDialog); // Style here
dialog.setContentView(view);
dialog.show();

2
Краще, ніж прийнята відповідь, тому що таким чином ви можете мати різний досвід у різних BottomSheetDialogs
Лука

Тепер крива видно, але прозорий колір на всьому екрані на дотик видно лише білий колір внизу діалогового вікна @Badr будь-яка корекція?
Арнольд Браун

Тут це спрацювало. Дякую!
Мішель Фернандес

Це рішення, яке я шукав, абсолютно хак.
Prateek Gupta

26

створити фігуру з назвою rounded_corners_shape

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <corners
        android:topLeftRadius="8dp"
        android:topRightRadius="8dp"/>
    <solid android:color="@color/white"/>

</shape>

визначити стиль

  <style name="AppBottomSheetDialogTheme"
           parent="Theme.Design.Light.BottomSheetDialog">
        <item name="bottomSheetStyle">@style/AppModalStyle</item>
    </style>

    <style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal">
        <item name="android:background">@drawable/rounded_corners_shape</item>
    </style>

використовуйте цей стиль на власному BottomSheetDialogFragment ось так, це буде працювати!

 public class CustomDialogFragment extends BottomSheetDialogFragment {
      @Override
      public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NORMAL, R.style. AppBottomSheetDialogTheme);
      }

      ...
    }

Було б корисно, якщо ви додасте дещо роз’яснення разом із кодом.
UditS

Це правильне місце для встановлення теми для Fragments.
DYS

10

Якщо ви використовуєте останню версію компонента матеріалу, вам просто потрібно перевизначити ShapeAppearance.MaterialComponents.LargeComponent(оскільки нижній аркуш використовує цю фігуру) і встановити потрібне значення:

 <style name="ShapeAppearance.YourApp.LargeComponent" parent="ShapeAppearance.MaterialComponents.LargeComponent">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">12dp</item>
 </style>

А потім встановіть у своєму стилі програми:

<item name="shapeAppearanceLargeComponent">@style/ShapeAppearance.YourApp.LargeComponent</item>

Рішення Габріеле Маріотті подібне і теж працює, але це простіше.


У порівнянні з іншими, це набагато краще рішення, оскільки більшість розчинів знаходяться на базі встановлених на замовлення малюнків
d-feverx

1
Виглядає добре. Це також стосується BottomSheetDialog?
Джейден Гу

1
Примітка для всіх: Використання цієї відповіді призведе до того, що всі компоненти, що використовують, ShapeAppearance.MaterialComponents.LargeComponentмають однакові розміри та сімейство, а не лише нижній аркуш. Перевірте свої вимоги до стилю та вирішіть, чи хочете ви змінити зовнішній вигляд для всього компонента або лише для окремого компонента чи віджета.
nitinkumarp

8

Я перевіряв те саме сьогодні, і так, ви мали рацію щодо наступного коду

this.getDialog().getWindow().setBackgroundDrawableResource(R.drawable.charge_layout_background);

це стосується фону фрагментів, тому замість цього ви повинні отримати нижній вигляд таблиці з діалогового вікна і змінити фон, ось код

 @SuppressLint("RestrictedApi")
    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        View rootView = getActivity().getLayoutInflater().inflate(R.layout.view_member_info,null,false);
        unbinder = ButterKnife.bind(this, rootView);
        adjustUIComponents();
        dialog.setContentView(rootView);
        FrameLayout bottomSheet = (FrameLayout) dialog.getWindow().findViewById(android.support.design.R.id.design_bottom_sheet);
        bottomSheet.setBackgroundResource(R.drawable.container_background);
    }

тут нижній аркуш - це фактичний вигляд, який ви хочете змінити.


Єдиний спосіб я отримав це працює. До речі, я використовую BottomSheetDialogFragmentтак, щоб логіка була в onCreateDialogметоді
Кирило Старостін

8

Відповідь Коми Іпа з іншого питання спрацювала у мене, спробуйте.

Створіть файл xml для малювання, скажімо dialog_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white"/>
    <corners android:radius="30dp" />
    <padding
        android:left="10dp"
        android:top="10dp"
        android:right="10dp"
        android:bottom="10dp" />
</shape>

помістіть це у свій кореневий вузол xml макета:

встановіть його як фон у вашому макеті xml

android:background="@drawable/dialog_bg"

і onCreateView()вкласти це:

встановіть фон вашого діалогового вікна на прозорий

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

Це має бути правильним рішенням, оскільки воно працює для всіх діалогових фрагментів, не перескакуючи через обручі.
jssingh

3
Для мене все ще є білі кути за моїми округлими кутами. Отже, коли я зміню кольори мого малюваного на червоний, ваш код працює правильно і створює округлий червоний прямокутник, але за цим все ще є білий прямокутник за замовчуванням. Код "dialog.getWindow (). SetBackgroundDrawable ...", який ви написали, змінює колір усієї "затемненої" області над моїм діалоговим вікном, але знову ж таки, він пропускає ці два маленькі куточки. Чи знаєте ви, що може спричинити цю проблему?
Нік Дев,

Додаючи свій коментар вище, я повинен зазначити, що мені довелося змінити код у onCreateView () на " getDialog () .getWindow () ..." , щоб мій код міг запуститися. Можливо, саме тому у мене це не працює.
Нік Дев

1
@NickDev Опублікуйте нове запитання, якщо ви вважаєте, що це рішення не стосується вашого коду, і, можливо, ми знайдемо рішення.
Варіаг

@Variag Дякуємо за зв’язок; Я насправді придумав дешеве рішення, де я охоплюю модальне діалогове вікно нижнього аркуша за замовчуванням прямокутником того самого кольору, що і затемнена область за ним. Потім я додав другий прямокутник із закругленими кутами поверх цього. Це не ідеально, але виглядає чудово! Проте я ціную допомогу.
Нік Дев,

6
  1. Створіть фігуру, яку можна малювати .., яку ми будемо використовувати як фон нижнього аркуша. Введіть відповідне значення радіуса верхнього лівого та правого кута.

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <corners
            android:topLeftRadius="24dp"
            android:topRightRadius="24dp" />
        <padding android:top="2dp" />
        <solid android:color="@color/white" />
    </shape>
    
  2. Тепер створіть стиль для "Фрагмента діалогового вікна нижнього аркуша"

    <style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
            <item name="android:background">@drawable/drawable_bottomsheet_background</item>
        </style>
    
        <style name="BaseBottomSheetDialog" parent="@style/Theme.Design.Light.BottomSheetDialog">
            <item name="android:windowIsFloating">false</item>
            <item name="bottomSheetStyle">@style/BottomSheet</item>
        </style>
    
        <style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog" />
    
  3. Тепер створіть власний клас, який розширить BottomSheetDilogFragment, де ви надасте свій стиль.

    open class CustomRoundBottomSheet : BottomSheetDialogFragment() {
    
        override fun getTheme(): Int = R.style.BottomSheetDialogTheme
    
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = BottomSheetDialog(requireContext(), theme)
    
    }
    
  4. Тепер використовуйте цей клас там, де ви хочете мати круглий нижній аркуш. напр

    class BottomSheetSuccess : CustomRoundBottomSheet() {
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.bottomsheet_shopcreate_success, container, false)
        }
    
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
        }
    
    } 
    

5

У мене це спрацювало

створити фігуру з назвою shape_rounded_dialog

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_white" />
<corners
    android:topLeftRadius="16dp"
    android:topRightRadius="16dp" />

додати нижче стилі

<style name="AppBottomSheetDialogTheme" parent="Theme.MaterialComponents.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/CustomBottomSheetStyle</item>
</style>

<style name="CustomBottomSheetStyle" parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@drawable/shape_rounded_dialog</item>
</style>

У класі DialogFragment метод override getTheme також повертає стиль Yourself.

@Override
public int getTheme() {
    return R.style.AppBottomSheetDialogTheme;
}

4

Ця відповідь стосується лише питання встановлення кольору тла Color.TRANSPARENT після налаштування малюнка із закругленим фоном до макета.

Жодна з відповідей не спрацювала для мене, щоб встановити колір тла, Color.TRANSPARENTкрім переважного setupDialog()рішення:

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), 
R.layout.fragment_bottom_sheet, null);
    dialog.setContentView(contentView);
    ...
    ((View) contentView.getParent()).setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
}

АЛЕ те, що contentViewви встановили для діалогового вікна, це не те, що viewви отримуєте onViewCreated()при накачуванні onCreateView(). Це порушує стандартний потік, тому може спричинити проблеми, якими ви не можете скористатися View Bindings-Kotlin Android Extensions вonViewCreated()

Тому я трохи налаштував, щоб встановити фон у onActivityCreated():

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    (view?.parent as View).setBackgroundColor(Color.TRANSPARENT)
  }

Сподіваюся, що ця допомога отримала ті самі проблеми


2

Я знаю, що це питання вже має прийняту відповідь. Я хотів би задокументувати проблеми, через які я пережив, і те, як я нарешті змусив це працювати, щоб це було корисно для когось у майбутньому.

По-перше, я використовував Theme.AppCompat.Light.DarkActionBarяк батька для нашого AppTheme. Це означало, що рішення @Gabriele Mariotti постійно падало з помилкою Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior. Я виправив це, просто змінивши батьківського наTheme.MaterialComponents.Light.DarkActionBar . Це жодним чином не вплинуло на нашу тему, але RTE зник. Ви також можете вирішити цю проблему, просто включивши елементи стилю до вашого стилю. Але я не потрудився з’ясувати, які стилі вимагає BottomSheetBehavior.

По-друге, намагайся як міг, але я не зміг отримати фактичний макет кадру (яким був BottomSheetDialogFragment), щоб мати круглі кути. Я зрозумів, що встановлення цього для зображення Drawable працювало, але не з фігурою чи a @null. Виявляється, це було тому, що LinearLayoutя використовував мав визначений фон. Це перекривало будь-який фон у стилі. Видалення, що нарешті призвело до закруглених кутів.

Крім того, я не вимагав встановлення будь-якої фонової форми для округлення кутів. Рішення @Gabriele Mariotti запрацювало, як тільки я вніс зазначені вище зміни. Однак, щоб встановити колір фону таким, яким я хотів, він повинен був замінити пункт "backgroundTint".

PS: Я новачок у розробці Android і підтримую старий додаток, створений для внутрішнього використання в нашому коледжі. Я не так добре знайомий з системою компонування Android або з бібліотекою матеріалів. Я думаю, саме тому у мене знадобилося 3 дні, щоб це зрозуміти. Сподіваюся, це комусь стане в нагоді в майбутньому.


1

Додайте ці два методи у свій клас BottomsheetDialogFragment.

public void setDialogBorder(Dialog dialog) {
        FrameLayout bottomSheet = (FrameLayout) dialog.getWindow().findViewById(android.support.design.R.id.design_bottom_sheet);
        bottomSheet.setBackground(new ColorDrawable(Color.TRANSPARENT));
        setMargins(bottomSheet, 10, 0, 10, 20);
    }

    private void setMargins(View view, int left, int top, int right, int bottom) {
        if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
            ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
            p.setMargins(left, top, right, bottom);
            view.requestLayout();
        }
    }

Тепер викличте setDialogBorder(dialog)метод у setupDialog()методі вашого класу BottomsheetDialogFragment.

Тепер створіть файл фігури у папці, яку можна малювати.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="20dp" />

    <solid android:color="@color/white" />
    <stroke
        android:width="1dp"
        android:color="@color/transparent" />
</shape>

Тепер встановіть фон для батьківського діалогового вікна групи перегляду у файлі xml.

android:background="@drawable/round_border_white"

Готово !!


Який вигляд ви використовуєте з setMargins?
tmm1

FrameLayout bottomSheet; Це визначено методом setDialogBorder (). Це насправді вигляд за замовчуванням для діалогового вікна нижнього аркуша в android. Це буде працювати нормально.
DalveerSinghDaiya

0

Інший спосіб вирішити цю проблему - розширити BottomSheetDialog і створити власний клас, який відповідає вашим потребам. Ви можете зробити те саме для файлу xml макета та додати фонові або будь-які інші необхідні налаштування. Це також має ту перевагу, що ви не будете залежати від імен ідентифікаторів, що використовуються Android (android.support.design.R.id.design_bottom_sheet), одночасно змінюючи фон (хоча зміна імені ідентифікатора рідко трапляється AFAIK).


0

Створіть власний малювальний файл із закругленим кутом і встановіть його як фон кореня макета вашого BottomSheetDialogFragment

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<solid android:color="@color/colorPrimary" />

<corners
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    android:topLeftRadius="12dp"
    android:topRightRadius="12dp" />

</shape>

А потім просто додайте наведений нижче код до класу BottomSheetDialogFragment

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), 
R.layout.fragment_bottom_sheet, null);
    dialog.setContentView(contentView);

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent())
            .getLayoutParams();
    CoordinatorLayout.Behavior behavior = params.getBehavior();
    ((View) contentView.getParent()).setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
}

Ви навіть можете грати з параметрами, щоб встановити поля, як показано нижче

params.setMargins(50, 0, 50, 0);

0

Вам потрібно змінити значення, bottom sheet themeщоб досягти верхніх макетів круглої форми

Створіть власний малювальний background_bottom_sheet_dialog_fragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
    <corners
       android:topLeftRadius="8dp"
        android:topRightRadius="8dp" />
    <padding android:top="0dp" />
    <solid android:color="@color/white" />
</shape>

Потім перевизначте bottomSheetDialogTheme на styles.xml, використовуючи як фон, що малюється:

<!--Bottom sheet-->
<style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
    <item 
    name="android:background">@drawable/background_bottom_sheet_dialog_fragment
    </item>
</style>

<style name="BaseBottomSheetDialog" 
    parent="@style/Theme.Design.Light.BottomSheetDialog">
    <item name="android:windowIsFloating">false</item>
    <item name="bottomSheetStyle">@style/BottomSheet</item>
</style>

<style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog" />

Це змінить фонове розташування нижнього аркуша

BottomSheetDialog

class SheetFragment() : BottomSheetDialogFragment() {

    lateinit var binding: SheetFragmentBinding;

  override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog;
    val view = View.inflate(context, R.layout.fragment_bottom_sheet, null);

    binding = DataBindingUtil.bind(view)!!;
    binding.viewModel = SheetFragmentVM();

    dialog.setContentView(view);

    var bottomSheetBehavior = BottomSheetBehavior.from(view.parent as View);
    bottomSheetBehavior.setPeekHeight(BottomSheetBehavior.PEEK_HEIGHT_AUTO);

    bottomSheetBehavior.setBottomSheetCallback(object : 
     BottomSheetBehavior.BottomSheetCallback() {
        override fun onStateChanged(bottomSheet: View, newState: Int) {
            if (BottomSheetBehavior.STATE_EXPANDED == newState) {
               // do on STATE_EXPANDED
            }
            if (BottomSheetBehavior.STATE_COLLAPSED == newState) {
                // do on STATE_COLLAPSED
            }

            if (BottomSheetBehavior.STATE_HIDDEN == newState) {
                dismiss()

            }
        }

        override fun onSlide(bottomSheet: View, slideOffset: Float) {
           // do on slide
        }
    })

    return dialog
}

0

додайте фігуру із закругленим кутом, зробіть це фоном для вашого кореневого макета

<?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
 <corners
    android:topLeftRadius="@dimen/padding_margin_16_dp"
    android:topRightRadius="@dimen/padding_margin_16_dp" />
 <solid android:color="@color/white" />
</shape>

зробіть фон прозорим на вашому BottomSheetDialogFragment

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    (view?.parent as View).setBackgroundColor(Color.TRANSPARENT)
}

його робота для Contraintlayout, Framelyaout, Linearlayout, Relativelayout.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.