Android: el niño especificado ya tiene un padre. Debe llamar a removeView () en el padre del niño primero

Sé que hay docenas de preguntas que hacen acerca de este error, pero ninguna de las soluciones propuestas parecen aplicarse a mi problema, al menos eso veo.

Aquí está mi registro:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. at android.view.ViewGroup.addViewInner(ViewGroup.java:1976) at android.view.ViewGroup.addView(ViewGroup.java:1871) at android.view.ViewGroup.addView(ViewGroup.java:1851) at com.android.internal.app.AlertController.setupView(AlertController.java:365) at com.android.internal.app.AlertController.installContent(AlertController.java:206) at android.app.AlertDialog.onCreate(AlertDialog.java:251) at android.app.Dialog.dispatchOnCreate(Dialog.java:307) at android.app.Dialog.show(Dialog.java:225) at com.company.MyApp.MyActivity$7.onItemClick(MyActivity.java:240) at android.widget.AdapterView.performItemClick(AdapterView.java:284) at android.widget.ListView.performItemClick(ListView.java:3513) at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3683) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method) 

Aquí está MyActivity.java onCreate (). Puede ver que se muestra un Generador de diálogo y se le asignan algunos valores. Tanto myDialogLayout como myDialogBuilder son miembros de clases privadas

 @Override public void onCreate( Bundle savedInstanceState ) { // ... a bunch of init code... // Create a dialog builder myDialogLayout = getLayoutInflater().inflate(R.layout.leaving, null); myDialogBuilder = new AlertDialog.Builder(this) .setTitle("My Title") .setView(myDialogLayout) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, int which ) {} }); // ... more code ... } 

Más adelante, cuando se hace clic en un determinado botón en mi Actividad, myDialogBuilder se personaliza un poco y luego se crea un cuadro de diálogo y se muestra. myDialog es una variable / miembro de clase privada:

 // Builder customized a bit myDialogBuilder .setMessage("custom message here"); // Dialog created from Builder myDialog = myDialogBuilder.create(); // Dialog shown myDialog.show(); // <---- MyActivity.java Line: 240 

Así que en mi problema, cuando hago clic en mi botón, el diálogo se crea con éxito. Pero después de presionar Cancelar en el cuadro de diálogo y luego presionar el botón otra vez, consigo el error visto en el registro. Por alguna razón, la actividad no quiere que myDialog a usar mi diálogo myDialog . Es un miembro de clase, por lo que es accesible desde el controlador onClick . Y el myDialog es un nuevo cuadro de diálogo cada vez que se hace clic en el botón, porque es creado desde cero por myDialogBuilder.create() cada vez.

¿Alguien sabe cuál es el problema? También intenté agregar en myDialog.dismiss() cuando se presiona el botón Cancelar pero eso no myDialog.dismiss() diferencia.

Además, puedes ver en mi myDialogBuilder que se myDialogBuilder un diseño XML personalizado para la vista del Diálogo. De acuerdo con el mensaje de error, sonaba como si quisiera usar removeView() para eliminar la vista de ser utilizado en el cuadro de diálogo. Pero myDialogBuilder.removeView() no es un método válido.

myDialogLayout es una variable de miembro de clase? Si es así, entonces ya tiene un padre desde la primera vez que muestre el diálogo, entonces usted crea un segundo diálogo que también intenta ser el padre de myDialogLayout . Intente crear una nueva instancia de myDialogLayout cada vez que abra el cuadro de diálogo.

Este es un ejemplo principal de por qué se recomienda el uso de los métodos onCreateDialog () onPrepareDialog ().

Si está instanciando myDialog cada vez que presiona su botón, está intentando adjuntar las vistas desde el objeto de diálogo creado previamente (el antiguo padre) al nuevo cuadro de diálogo.

Un diálogo que ha sido instanciado, mostrado y desechado, sólo tiene que ser mostrado nuevamente, no completamente recreado.

Suponiendo que myDialog es un miembro de la clase, pruebe a comprobar si miDialog es es nulo primero o no. Si no es nulo, muéstrelo de nuevo en lugar de instanciarlo completamente.

EDIT – Aquí hay un ejemplo de lo que quiero decir, utilizando onPrepareDialog () y onCreateDialog (). En Crear crea el diálogo, y cada vez que se muestra, se prepara y se obtiene una referencia EditText utilizando findViewById y el texto borrado. Asumimos que DIALOG_TEST es una constante entera, y que en layout / dialog_test.xml hay una vista EditText con id edittext.

 @Override protected void onPrepareDialog(int id, Dialog dialog) { switch(id){ case DIALOG_TEST: EditText mEditText = (EditText) dialog.findViewById(R.id.edittext); mEditText.setText(""); break; } } @Override protected Dialog onCreateDialog(int id) { AlertDialog.Builder builder = new AlertDialog.Builder(this); switch(id){ case DIALOG_TEST: LinearLayout layout = (LinearLayout) ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.dialog_test, null); builder.setTitle("Enter Something").setView(layout); return builder.create(); } } 
  • Android: ¿Dónde poner el código onCreate () de la actividad en un fragmento?
  • egl_emulation eglsurfaceattrib no implementado con reproductor de streaming
  • Error de Retrofit de Android al generar una solicitud
  • Cómo colorear una parte específica de una cadena
  • Calcular Pi en un teléfono Android
  • Cómo cambiar el archivo de salida de un mediarecorder sin detener el mediarecorder
  • Programáticamente establecer la sugerencia de texto de edición en android?
  • Android objetivo se cambia después de hacer cordova plataforma de actualización
  • Esta versión de la biblioteca de renderizado es más reciente que su versión de Android Studio. Actualiza Android Studio
  • ¿Puedo estar seguro de que la aplicación Android terminó de ejecutarse comprobando isFinish () en OnPause () de la actividad principal?
  • ¿Cómo puedo guardar el estado de mi webview al cambiar la orientación usando un webviewfragment
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.