Esquina redonda para BottomSheetDialogFragment


114

tengo un BttomSheetDialogFragment personalizado y quiero tener esquinas redondeadas en la parte superior de la vista inferior

esta es mi clase personalizada que inflando mi diseño que quiero que aparezca desde abajo

View mView;

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

y también tengo este archivo de recursos xml como fondo:

<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"/>

pero el problema es que, cuando configuro este archivo de recursos como fondo del elemento raíz de mi diseño, las esquinas aún no están redondeadas

y no puedo usar el siguiente código:

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

porque anula el fondo predeterminado de BottomSheetDialog y no habrá ningún color gris semitransparente sobre mi Vista inferior


5
@RasoolGhana - Eche un vistazo a este enlace: medium.com/halcyon-mobile/…
Mohit Charadva

Respuestas:


238

Crea un dibujo personalizado 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>

Luego anule bottomSheetDialogThemeel styles.xmluso del dibujable como fondo:

<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>

Esto cambiará todos los BottomSheetDialogs de su aplicación.


2
Esto funciona para mi. También noté que depende del elemento raíz del diseño. Primero tuve cardview como raíz (porque probé otra forma de redondear las esquinas), luego lo cambié a un diseño lineal y ahora funciona perfectamente
Ivan Shafran

1
Se bloquea en la API 17 de Android
Morteza Rastgoo

1
No usaría rounded_dialog& AppModalStylenames con un fondo donde solo las esquinas superiores están redondeadas, ya que solo esperaría usar un fondo de este tipo con un estilo de hoja inferior. ¿Qué tal bottomsheet_rounded_background&AppBottomSheetStyle
hmac

3
Tenga en cuenta que si especifica un fondo en la vista raíz, esto anulará esta configuración
hmac

2
¡asegúrese de no tener antecedentes sobre el elemento raíz del diseño de su hoja!
MMK

81

Con la nueva biblioteca de componentes de material , puede personalizar la forma de su componente usando el shapeAppearanceOverlayatributo en su estilo ( Nota: requiere la versión 1.1.0 )

Simplemente use el método de BottomSheetDialogFragmentanulación onCreateViewy luego defina su estilo personalizado para los cuadros de diálogo de la hoja inferior.

Defina el bottomSheetDialogThemeatributo styles.xmlen el tema de su aplicación:

  <!-- 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>

Entonces simplemente defina su forma favorita con 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>

ingrese la descripción de la imagen aquí


Puede obtener el mismo comportamiento anulando este método en su BottomSheetDialogFragment(en lugar de agregar el bottomSheetDialogThemetema en su aplicación):

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

En este caso, está utilizando este themeOverlay solo en el single BottomSheetDialogFragmenty no en toda la aplicación.


Nota importante sobre el ESTADO EXPANDIDO :

En el estado expandido, BottomSheet tiene esquinas planas . Puede consultar el comentario oficial en el repositorio de github :

Nuestro equipo de diseño tiene una fuerte opinión de que las esquinas redondeadas indican contenido desplazable, mientras que las esquinas planas indican que no hay contenido adicional. Como tal, no quieren que agreguemos este cambio con fitToContents.

Este comportamiento lo proporciona el BottomSheetBehaviory es imposible anularlo.
Sin embargo, hay una solución:> DESCARGO DE RESPONSABILIDAD: ¡ puede dejar de funcionar en las próximas versiones!

Puede agregar un BottomSheetCallbacken el 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 usando esta técnica, si toco en algún lugar de la hoja y no se descarta, las esquinas se animan. No estoy seguro de si desarrolla en los componentes de material de Android, pero si es así, ¿conocía este problema? Estaba usando 1.1.0-alpha10, pero también revisé beta2. No estoy seguro de si depende de las vistas exactas que coloque en la hoja o no.
androidguy

1
He informado de este problema: issuetracker.google.com/issues/144859239 Si alguien tiene más hallazgos o una solución para el problema, responda. ¡Gracias!
androidguy

4
Recibo este error y bloqueo en v1.1.0-beta02Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
hkchakladar

3
No funciona si se expande el cuadro de diálogo de la hoja inferior. ¿Alguna idea?
José Carlos

4
Esta fue la respuesta perfecta y más reciente. Necesito marcar esto como respuesta
Vikas Acharya

38

El BottomSheetDialogestá configurando un color de fondo blanco predeterminado, es por eso que las esquinas no son visibles. Para mostrarlas, debe hacer que el fondo del cuadro de diálogo sea transparente anulando el estilo del BottomSheetDialog.

Defina este estilo en su 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>

Y establezca este estilo en su 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
Mejor que la respuesta aceptada, porque de esta manera puede tener diferentes antecedentes en diferentes BottomSheetDialogs
Luke

Ahora la curva es visible, pero un color transparente en toda la pantalla al tocar solo el color blanco en el cuadro de diálogo inferior es visible @Badr ¿alguna corrección?
Arnold Brown

Esa es la solución que estaba buscando, totalmente gratis.
Prateek Gupta

26

crear una forma llamada forma_esquinas_ redondeadas

<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>

definir un estilo

  <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>

use este estilo en su BottomSheetDialogFragment personalizado como este, ¡funcionará!

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

      ...
    }

Sería útil si agrega alguna aclaración junto con el código.
UditS

Este es el lugar adecuado para establecer el tema de Fragments.
DYS

10

Si usa la última versión del componente de material, solo tiene que anular ShapeAppearance.MaterialComponents.LargeComponent(ya que la hoja inferior usa esta forma) y establecer el valor que desee, como:

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

Y luego configure el estilo de su aplicación:

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

La solución de Gabriele Mariotti es similar y también funciona, pero esta es más simple.


En comparación con otras, es una solución mucho mejor, porque la mayor parte de la solución se basa en un diseño personalizado del conjunto
d-feverx

1
Se ve bien. ¿Esto también se aplica a BottomSheetDialog?
Jaden Gu

1
Nota para todos: el uso de esta respuesta hará que todos los componentes ShapeAppearance.MaterialComponents.LargeComponenttengan el mismo tamaño de esquina y familia, no solo la hoja inferior. Verifique su requisito de estilo y decida si desea cambiar la apariencia de todos los componentes o solo de un componente o widget individual.
nitinkumarp

9

La respuesta de Koma Yip de otra pregunta funcionó para mí, deberías intentarlo.

Cree un xml en dibujable, digamos 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>

poner esto en su nodo raíz xml de diseño:

configúrelo como fondo en su diseño xml

android:background="@drawable/dialog_bg"

y en onCreateView()poner esto:

establece el fondo de tu diálogo en transparente

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

Esta debería ser la solución correcta porque funciona para todos los DialogFragments sin saltarse los obstáculos.
jssingh

3
Para mí, todavía hay esquinas blancas detrás de mis esquinas redondeadas. Entonces, cuando cambio el color de mi elemento de dibujo a rojo, su código funciona correctamente y crea un rectángulo rojo redondeado, pero detrás de eso todavía hay un rectángulo blanco predeterminado. El código "dialog.getWindow (). SetBackgroundDrawable ..." que escribiste cambia el color de toda el área "oscurecida" sobre mi cuadro de diálogo, pero de nuevo, pierde esos dos rincones. ¿Sabes qué podría estar causando este problema?
Nick Dev

Añadiendo a mi comentario anterior, debo tener en cuenta que tuve que cambiar el código en onCreateView () a " getDialog () .getWindow () ..." para que mi código se ejecute. Quizás es por eso que no me funciona.
Nick Dev

1
@NickDev Publique una nueva pregunta si cree que esta solución no se aplica a su código y tal vez encontremos una solución.
Variag

@Variag Gracias por comunicarte; De hecho, se me ocurrió una solución económica en la que cubro el cuadro de diálogo modal de la hoja inferior predeterminado con un rectángulo que es del mismo color que el área oscurecida detrás de él. Luego agregué un segundo rectángulo con esquinas redondeadas encima de eso. No es ideal, ¡pero luce genial! No obstante, agradezco la ayuda.
Nick Dev

8

Estaba comprobando lo mismo hoy y sí, tenías razón sobre seguir el código

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

esto se aplica al fondo del fragmento, por lo que debe obtener la vista de la hoja inferior desde la ventana de diálogo y cambiar el fondo aquí está el código

 @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);
    }

aquí la hoja inferior es la vista real que desea cambiar.


La única manera de que esto funcione. Por cierto, lo estoy usando BottomSheetDialogFragmentpara que la lógica esté en el onCreateDialogmétodo
Kirill Starostin

6
  1. Crea una forma dibujable ... que usaremos como fondo para la hoja inferior. Proporcione el valor apropiado para el radio de la esquina superior izquierda y derecha.

    <?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. Ahora cree un estilo para el "Fragmento de diálogo de la hoja inferior"

    <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. Ahora crea una clase personalizada que ampliará BottomSheetDilogFragment, donde proporciones tu estilo.

    open class CustomRoundBottomSheet : BottomSheetDialogFragment() {
    
        override fun getTheme(): Int = R.style.BottomSheetDialogTheme
    
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = BottomSheetDialog(requireContext(), theme)
    
    }
    
  4. Ahora use esta clase donde quiera que tenga una hoja inferior de esquina redondeada. p.ej

    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

Funcionó para mi

crea una forma llamada shape_unded_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" />

agregar estilos a continuación

<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>

En la clase DialogFragment, el método override getTheme también devuelve el estilo Yourself.

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

4

Esta respuesta es solo para el problema de configurar el color de fondo Color.TRANSPARENTdespués de configurar un elemento de diseño con fondo redondeado para el diseño.

Ninguna de las respuestas me funcionó para establecer el color de fondo, Color.TRANSPARENTexcepto la setupDialog()solución principal :

@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));
}

PERO el contentViewque establece para el diálogo aquí no es el viewque onViewCreated()ingresa al inflar onCreateView(). Rompe el flujo estándar, por lo que puede generar problemas que no puede usar View Bindings, Kotlin Android ExtensionsenonViewCreated()

Así que modifico un poco para establecer el fondo en onActivityCreated():

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

Espero que esto ayude a quien tuvo el mismo problema


2

Sé que esta pregunta ya tiene una respuesta aceptada. Me gustaría documentar los problemas por los que pasé y cómo finalmente lo hice funcionar para que sea útil para alguien en el futuro.

En primer lugar, estaba usando Theme.AppCompat.Light.DarkActionBarcomo padre para nuestro AppTheme. Esto significaba que la solución de @Gabriele Mariotti seguía fallando con el error Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior. Arreglé esto simplemente cambiando el padre aTheme.MaterialComponents.Light.DarkActionBar . Esto no afectó nuestro tema de ninguna manera, pero el RTE desapareció. También puede solucionar este problema simplemente incluyendo los elementos necesarios en su estilo. Pero no me molesté en averiguar qué estilos requería BottomSheetBehavior.

En segundo lugar, lo intenté como pude, pero no pude obtener el diseño del marco real (que era el BottomSheetDialogFragment) que usa para tener esquinas redondeadas. Me di cuenta de que establecer esto en una imagen Drawable funcionaba pero no con una forma o un @null. Resulta que fue porque elLinearLayout que estaba usando tenía un fondo definido. Esto estaba anulando cualquier trasfondo en el estilo. Eliminar eso finalmente resultó en esquinas redondeadas.

Además, no necesité que se estableciera ninguna forma de fondo para redondear las esquinas. La solución de @Gabriele Mariotti funcionó tan pronto como hice los cambios anteriores. Sin embargo, para establecer el color de fondo como quería que fuera, tuve que anular el elemento "backgroundTint".

PD: Soy nuevo en el desarrollo de Android y estoy manteniendo una aplicación antigua que se creó para uso interno en nuestra universidad. No estoy tan familiarizado con el sistema de diseño de Android o con la biblioteca de materiales. Supongo que por eso me tomó 3 días darme cuenta de esto. Espero que esto sea útil para alguien en el futuro.


1

Agregue estos dos métodos en su clase 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();
        }
    }

Ahora llame al setDialogBorder(dialog)método ensetupDialog() método de su clase BottomsheetDialogFragment.

Ahora cree un archivo de forma en su carpeta dibujable.

<?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>

Ahora configure el fondo para la vista del cuadro de diálogo del grupo de vistas principal en un archivo xml.

android:background="@drawable/round_border_white"

¡¡Hecho!!


¿Qué vista usas con setMargins?
tmm1

FrameLayout bottomSheet; Este definido en el método setDialogBorder (). En realidad, esta es la vista predeterminada para el cuadro de diálogo de la hoja inferior en Android. Funcionará bien.
DalveerSinghDaiya

1

agregue forma con la esquina redondeada, conviértalo en fondo para su diseño raíz

<?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>

hacer que el fondo sea transparente en su BottomSheetDialogFragment

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

su trabajo para Contraintlayout, Framelyaout, Linearlayout, Relativelayout.


0

Otra forma de solucionar este problema es ampliar BottomSheetDialog y crear una clase personalizada que se adapte a sus necesidades. Puede hacer lo mismo para el archivo xml de diseño y agregar fondo o cualquier otra personalización necesaria. Esto también tiene la ventaja de que no dependerá de los nombres de identificación utilizados por Android (android.support.design.R.id.design_bottom_sheet), mientras cambia el fondo (aunque el cambio de nombre de identificación rara vez ocurre AFAIK).


0

Cree un elemento de diseño personalizado con esquinas redondeadas y configúrelo como fondo de la raíz de diseño de su 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>

Y luego simplemente agregue el siguiente código a su clase 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));
}

Incluso puede jugar con los parámetros para establecer el margen como se muestra a continuación

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

0

Tienes que cambiar bottom sheet themepara lograr el diseño redondo superior

Cree un background_bottom_sheet_dialog_fragment.xml de diseño personalizado:

<?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>

Luego anule bottomSheetDialogTheme en styles.xml usando el elemento de diseño como fondo:

<!--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" />

Esto cambiará el diseño de fondo de su hoja inferior

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
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.