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();
}