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:
- ¿Existe un Java / Android equivalente a la función iOS "componentsJoinedByString" para un NSArray?
- El evento LongClick también activa el evento Click
- Cómo utilizar la conexión SQLite desde la carpeta de activos
- MediaRecorder start () falla si se llama demasiado rápido
- Android / Java: comprueba si url es url válida de youtube
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.
- El anuncio de AdMob no se cargará. Error 2. Funcionó antes pero de repente se detuvo
- ¿Cuál es la forma correcta de obtener el inflador de diseño en Android?
- Software de reconocimiento de voz Open Source en Java
- ¿Por qué no están dibujando mis puntos de vista?
- Evento para Android de larga duración
- ¿Es imposible hacer un juego Android sin tartamudear? Me estoy volviendo loco aqui
- Mostrar una notificación sólo en el dispositivo portátil
- Android Studio establece una alarma exacta con Icono
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 studio java.exe terminado con valor de salida no nulo 3
- Obtener todas las alarmas guardadas en la aplicación de alarma