¿Cómo crear BottomSheetDialogFragment utilizando el componente de arquitectura de navegación?

3 minutos de lectura

estoy usando Fragmento de diálogo de hoja inferior para mostrar algunas configuraciones personalizadas.

Requisito:

Cuando hago clic en cualquier pestaña en BottomSheetDialogFragment, reemplazo el fragmento y lo agrego a backstack para que cuando el usuario haga clic en la acción onBackPress o Up, debería volver al fragmento de la última configuración de BottomSheetDialogFragment.

Quiero usar el componente de arquitectura de navegación para simplificar mis transacciones.

Problema: si uso el componente de arquitectura de navegación para navegar desde FragmentA hasta BottomSheetDialogFragment, recibo el siguiente error.

java.lang.IllegalStateException: el diálogo no debe ser nulo BottomSheetDialogFragment

No sé cómo instanciar BottomSheetDialogFragment usando el Componente de Arquitectura de Navegación y usando el siguiente código no tendrá una pila de mantenimiento usando el Componente de Arquitectura de Navegación.

BottomSheetDialogFragment.show(FragmentManager manager, String tag)

  • Hola @anmol, obtuviste alguna solución para esto porque estoy tratando de hacer lo mismo

    – Hemant Sangle

    26 de marzo de 2019 a las 6:40

  • Traté de hacerlo de una manera diferente mira este proyecto de demostración github.com/andor201995/NavigationDemo @HemantSangle

    – Anmol

    26 de marzo de 2019 a las 12:08


  • ok revisare el link

    – Hemant Sangle

    26 de marzo de 2019 a las 12:11

  • Construiré una respuesta adecuada y la publicaré aquí. @HemantSangle

    – Anmol

    26 de marzo de 2019 a las 12:15


  • Eso será grandioso

    – Hemant Sangle

    26 de marzo de 2019 a las 12:47

En la versión del componente de navegación 2.1.0-alpha04, Navigation Graph puede contener dialog como uno de los destinos.

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_navigation"
    app:startDestination="@id/startFragment">

    <fragment
        android:id="@+id/loginFragment"
        android:name="com.awesomeproject.android.authentication.login.LoginFragment"
        android:label="Login"
        tools:layout="@layout/login_fragment" />

    <dialog
        android:id="@+id/bottomSheet"
        android:name="com.awesomproject.android.BottomSheetFragment"
        tools:layout="@layout/bottom_sheet_dialog_fragment" />

</navigation>

El BottomSheetFragment se verá similar a otro BottomSheet.

class BottomSheetFragment : BottomSheetDialogFragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View =
            inflater.inflate(R.layout.bottom_sheet_dialog_fragment, container, false)
}

Entonces puedes tratar bottomSheet de la misma manera que otros destinos. Puede navegar a este destino o pasar safeArgs en.

¡Salud!

  • Intenté esto, pero cuando trato de navegar desde el cuadro de diálogo usando la navegación, falta NavController. ¿Puede compartir el código de navegación del cuadro de diálogo con otros fragmentos o cuadros de diálogo? @Boonya

    – Anmol

    18 de junio de 2019 a las 11:02

  • con esta solución, la hoja inferior se muestra en otro fragmento, no sombrea el fragmento actual que lo llama

    – AndroLife

    29 de septiembre de 2019 a las 0:02

  • Oh hombre, fue aterrador cuando agregué BottomSheet con navegación cuando se abrió en pantalla completa. Pero me ahorras tiempo. Fue fácil simplemente cambiar el diálogo de un fragmento.

    – Pranav P.

    8 de enero de 2020 a las 5:01

  • @AndroLife, ¿conoces la solución para ese problema?

    – Ralph

    21 de enero de 2021 a las 14:45

  • @AndroLife FWIW Veo un comportamiento correcto con el material 1.4.0 y la navegación 2.3.5

    – tir38

    25 de septiembre de 2021 a las 16:58

¿Ha sido útil esta solución?