es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Llamando onBackPressed desde un DialogFragment se finaliza la actividad.

Tengo un fragmento de diálogo que tiene un botón de cierre.

Este diálogo se llama desde dos actividades diferentes. Una lo usa como un fragmento simple y otra como un fragmento de diálogo.

En su método onClick, llamo a requireActivity.onBackPress() para que cierre el diálogo.

No quiero llamar a dismiss, porque tengo un caso de uso en el que quiero que la actividad que lo llama lo maneje (mostrar un diálogo de confirmación).

En la actividad que lo muestra como un fragmento de diálogo, llamar a onBackPress no solo cierra el diálogo sino también finaliza la actividad :scary_face

Pulsar el botón de retroceso real simplemente lo descarta.

¿Algún pensamiento sobre qué me falta aquí?

Código del fragmento de diálogo:

viewBinding.closeBtn.setOnClickListener {
requireActivity().onBackPressed()
}

Código que inicia el fragmento de diálogo

SharePatientDialogFragment.newInstance(shareData)
.show(context.supportFragmentManager, "share")

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el método onBackPressed() llamado desde el fragmento de diálogo. Cuando se lanza el fragmento de diálogo como un diálogo, llamar a onBackPressed() activará el comportamiento del botón de retroceso que incluye descartar el diálogo y finalizar la actividad. Para resolver este problema sin usar dismiss(), puedes crear una interfaz de escucha en el fragmento de diálogo y hacer que la actividad que llama la implemente para manejar la acción de cierre.

    Primero, crea una interfaz en la clase de tu fragmento de diálogo:

    interface OnCloseListener {
        fun onClose()
    }
    

    Luego, agrega una variable para contener la instancia de la escucha en la clase del fragmento de diálogo:

    private var onCloseListener: OnCloseListener? = null
    

    A continuación, modifica el método onClick del botón de cierre para llamar a la escucha en lugar de onBackPressed():

    viewBinding.closeBtn.setOnClickListener {
        onCloseListener?.onClose()
    }
    

    En la actividad que utiliza el fragmento de diálogo, implementa la interfaz OnCloseListener y pasa su instancia al fragmento de diálogo:

    class MyActivity : AppCompatActivity(), SharePatientDialogFragment.OnCloseListener {
    
        fun showShareDialog() {
            val dialogFragment = SharePatientDialogFragment.newInstance(shareData)
            dialogFragment.onCloseListener = this // asignar instancia de escucha
            dialogFragment.show(supportFragmentManager, "share")
        }
    
        override fun onClose() {
            // manejar cierre
        }
    
    }
    

    Ahora, cuando se hace clic en el botón de cierre en el fragmento de diálogo, llamará el método onClose() en la actividad, que puedes usar para mostrar un diálogo de confirmación o manejar la acción de cierre según sea necesario.

Comments are closed.