you the texto studio specified removeview propiedades must mostrar has first example español edittext child already java android android-edittext textview parent-child

java - the - El niño especificado ya tiene un padre. Primero debe llamar a removeView() en el padre del niño(Android)



textview android studio español (15)

En mi aplicación, tengo que cambiar entre dos diseños con frecuencia. El error está ocurriendo en el diseño publicado a continuación.

Cuando se llama mi diseño por primera vez, no se produce ningún error y todo está bien. Cuando llamo a un diseño diferente (uno en blanco) y luego llamo a mi diseño por segunda vez, me da el siguiente error:

> FATAL EXCEPTION: main > java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child''s parent first.

Mi código de diseño se ve así:

tv = new TextView(getApplicationContext()); // are initialized somewhere else et = new EditText(getApplicationContext()); // in the code private void ConsoleWindow(){ runOnUiThread(new Runnable(){ @Override public void run(){ // MY LAYOUT: setContentView(R.layout.activity_console); // LINEAR LAYOUT LinearLayout layout=new LinearLayout(getApplicationContext()); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); // TEXTVIEW layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN // EDITTEXT et.setHint("Enter Command"); layout.addView(et); } } }

Sé que esta pregunta se ha hecho antes, pero no ayudó en mi caso.


El mensaje de error dice lo que debe hacer.

// TEXTVIEW if(tv.getParent() != null) { ((ViewGroup)tv.getParent()).removeView(tv); // <- fix } layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN // EDITTEXT


El siguiente código lo resolvió para mí:

View root = inflater.inflate(R.layout.single, null); LinearLayout lyt = root.findViewById(R.id.lytRoot); lytAll.addView(root);

Nota: El error fue de mi clase de fragmentos y al anular el método onDestroy como este, pude resolverlo.


En mi caso, el problema fue causado por el hecho de que estaba inflando la Vista principal con el diseño <merge> . En este caso, addView() causó el bloqueo.

view = inflater.inflate(R.layout.qr_fragment, container, false);

Eliminar addView() ayudó a resolver el problema.


En mi caso, sucede cuando quiero agregar una vista de padre a otra vista

if (textView.getParent() == null) layout.addView(textView);

debes agregar una vista principal como esta

@Override public void onDestroyView() { if (getView() != null) { ViewGroup parent = (ViewGroup) getView().getParent(); parent.removeAllViews(); } super.onDestroyView(); }


Encontré otra solución:

if(tv!= null){ ((ViewGroup)tv.getParent()).removeView(tv); // <- fix }

Aquí solo tengo una instrucción if para verificar si la vista tenía un padre y si no lo hizo Crear el nuevo diálogo, establecer el contentView y mostrar el diálogo en mi método "createAlgorithmDialog ()".

Esto también configura los botones positivo y negativo (ok y cancelar botones) con onClickListeners.


Mi caso era diferente, la vista secundaria ya tenía una vista primaria. Estoy agregando la vista secundaria dentro de la vista primaria a otra vista principal. ejemplo de código a continuación

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/lineGap" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/black1" android:layout_gravity="center" android:gravity="center" /> </LinearLayout>

Y estaba inflando esta vista y agregando a otro LinearLayout, luego eliminé el LinaarLayout del diseño anterior y comenzó a funcionar

El siguiente código solucionó el problema:

<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:textColor="@color/black1" />


Mi error fue definir la vista de esta manera:

View to_add = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, true); // parent_layout.addView(to_add); // THIS CAUSED THE CRASH

Faltaba:

view = inflater.inflate(R.layout.qr_fragment, container);


Puede usar este método para verificar si una vista tiene hijos o no.

public static boolean hasChildren(ViewGroup viewGroup) { return viewGroup.getChildCount() > 0; }


Recibí este mensaje al intentar cometer un fragmento usando adjuntar a raíz a verdadero en lugar de falso, así:

return inflater.inflate(R.layout.fragment_profile, container, true)

Después de hacer:

return inflater.inflate(R.layout.fragment_profile, container, false)

Funcionó.


Si otra solución no funciona como:

View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);

compruebe qué devuelve de onCreateView del fragmento, ¿es una vista única o un grupo de vista? en mi caso, tenía viewpager en la raíz de xml de fragmento y estaba devolviendo viewpager, cuando agregué viewgroup en el diseño no actualicé que tengo que devolver viewgroup ahora, no viewpager (view).


Vine aquí buscando el error con mi vista de reciclador pero la solución no funcionó (obviamente). He escrito la causa y la solución para ello en caso de una vista de reciclaje. Espero que ayude a alguien.

El error se produce si en onCreateViewHolder() sigue el siguiente método:

layoutInflater = LayoutInflater.from(context); return new VH(layoutInflater.inflate(R.layout.single_row, parent));

En cambio debería ser

return new VH(layoutInflater.inflate(R.layout.single_row, null));


compruebe si ya agregó la vista

View root = inflater.inflate(R.layout.single, null); LinearLayout lyt = root.findViewById(R.id.lytRoot); lytAll.addView(lyt); // -> crash


frameLayout.addView (bannerAdView); <----- si obtiene un error en esta línea, haga lo siguiente:

if (bannerAdView.getParent() != null) ((ViewGroup) bannerAdView.getParent()).removeView(bannerAdView); frameLayout.addView(bannerAdView); <------ now added view


simplemente pasa el argumento attachtoroot como falso

View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);


if (mView.getParent() == null) { myDialog = new Dialog(MainActivity.this); myDialog.setContentView(mView); createAlgorithmDialog(); } else { createAlgorithmDialog(); }