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.

MaterialAlertDialogBuilder se bloquea y muestra el error: “El hijo especificado ya tiene un padre”, cuando se utiliza una vista personalizada.

Cuando uso un diseño personalizado con MaterialAlertDialog, se bloquea y me muestra el siguiente error:

    java.lang.IllegalStateException: El hijo especificado ya tiene un padre. Primero debes llamar a removeView() en el padre del hijo.
        at com.example.applux.SettingsFragment.onViewCreated$lambda-3(SettingsFragment.kt:64) // línea 64

Fragmento de Settings:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding = FragmentSettingsBinding.bind(view)
    binding.settingsClickUsername.setOnClickListener {
        val valueBinding = EditValuesBinding.inflate(layoutInflater)
        MaterialAlertDialogBuilder(requireContext())
            .setTitle("Editar tu nombre de usuario")
            .setView(valueBinding.editValue)
            .setPositiveButton("Guardar"){ dialog, p ->

            }
            .setNegativeButton("Cancelar"){ dialog, p ->

            }
            .show() // esta es la línea 64
    }
}

Layout edit_values.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent">

    <com.google.android.material.textfield.textinputedittext android:id="@+id/edit_value" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintend_toendof="parent" app:layout_constraintstart_tostartof="parent" app:layout_constrainttop_totopof="parent"></com.google.android.material.textfield.textinputedittext>

</androidx.constraintlayout.widget.constraintlayout>

¿Alguna solución para este error y por qué ocurre?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que una vista especificada como una hija en el diseño personalizado ya ha sido agregada a otra vista principal. Este error ocurre porque el diseño EditValuesBinding ya está asociado con su vista padre, y cuando se agrega al MaterialAlertDialog, intenta agregarse a otra vista principal, de ahí el mensaje de error.

    Para solucionar este error, debes llamar al método removeView() en la vista principal de EditValuesBinding antes de inflarla en el MaterialAlertDialog. Una forma de hacer esto es pasar la vista principal al método inflate() y luego eliminarla de la vista principal antes de llamar a setView() en el MaterialAlertDialogBuilder. Aquí tienes el código actualizado:

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding = FragmentSettingsBinding.bind(view)
    
        binding.settingsClickUsername.setOnClickListener {
            val valueBinding = EditValuesBinding.inflate(layoutInflater, binding.root, false)
            (valueBinding.editValue.parent as ViewGroup?)?.removeView(valueBinding.editValue)
    
            MaterialAlertDialogBuilder(requireContext())
                .setTitle("Editar tu nombre de usuario")
                .setView(valueBinding.editValue)
                .setPositiveButton("Guardar"){ dialog, p ->
    
                }
                .setNegativeButton("Cancelar"){ dialog, p ->
    
                }
                .show()
        }
    }
    

    En este código actualizado, pasamos binding.root como la vista principal al método inflate() y establecemos el último parámetro en false para especificar que la vista inflada no debe adjuntarse a la vista principal. Luego obtenemos la vista principal de valueBinding.editValue y eliminamos valueBinding.editValue de ella antes de llamar a setView() en el MaterialAlertDialogBuilder.

    Al hacer esto, nos aseguramos de que valueBinding.editValue no esté adjunta a ninguna vista principal cuando se agregue al MaterialAlertDialog, evitando así el error de “la vista especificada ya tiene un padre”.

Comments are closed.