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?
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 alMaterialAlertDialog
, 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 deEditValuesBinding
antes de inflarla en elMaterialAlertDialog
. Una forma de hacer esto es pasar la vista principal al métodoinflate()
y luego eliminarla de la vista principal antes de llamar asetView()
en elMaterialAlertDialogBuilder
. Aquí tienes el código actualizado:En este código actualizado, pasamos
binding.root
como la vista principal al métodoinflate()
y establecemos el último parámetro enfalse
para especificar que la vista inflada no debe adjuntarse a la vista principal. Luego obtenemos la vista principal devalueBinding.editValue
y eliminamosvalueBinding.editValue
de ella antes de llamar asetView()
en elMaterialAlertDialogBuilder
.Al hacer esto, nos aseguramos de que
valueBinding.editValue
no esté adjunta a ninguna vista principal cuando se agregue alMaterialAlertDialog
, evitando así el error de “la vista especificada ya tiene un padre”.