type studio que layout_width layout_weight intent examples activity android xml android-layout android-intent

studio - type of layout android



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

Creo esta publicación porque soy nuevo en esto y necesito un poco de ayuda. Estoy haciendo un pequeño ejercicio sobre una aplicación que pone su nombre, y devuelve "hola" (el nombre que puso). Pero después de presionar el botón, aparece el error "El hijo especificado ya tiene un padre. Primero debe llamar a removeView () en el padre del niño"

MainActivity.java

package com.example.holaamigos; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.*; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { public final static String EXTRA_SALUDO = "com.example.holaamigos.SALUDO"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText txtNombre = (EditText)findViewById(R.id.TxtNombre); final Button btnHola = (Button)findViewById(R.id.BtnHola); btnHola.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, ActivitySaludo.class); String saludo = txtNombre.getText().toString(); intent.putExtra(EXTRA_SALUDO, saludo); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }

ActivitySaludo.java

package com.example.holaamigos; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class ActivitySaludo extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_saludo); Intent intent = getIntent(); String saludo = intent.getStringExtra(MainActivity.EXTRA_SALUDO); //TextView txt = new TextView(this); //txt.setText(20); //txt.setText(saludo); TextView txtCambiado = (TextView) findViewById(R.id.TxtSaludo); txtCambiado.setText(saludo); setContentView(txtCambiado); } }

activity_saludo.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/TxtSaludo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" /> </LinearLayout>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/LblNombre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/nombre" /> <EditText android:id="@+id/TxtNombre" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text" /> <Button android:id="@+id/BtnHola" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hola_apy" android:onClick="enviarSaludo"/> </LinearLayout>

LogCat

10-10 16:12:18.470: D/AndroidRuntime(810): Shutting down VM 10-10 16:12:18.470: W/dalvikvm(810): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 10-10 16:12:18.586: E/AndroidRuntime(810): FATAL EXCEPTION: main 10-10 16:12:18.586: E/AndroidRuntime(810): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.holaamigos/com.example.holaamigos.ActivitySaludo}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child''s parent first. 10-10 16:12:18.586: E/AndroidRuntime(810): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.app.ActivityThread.access$600(ActivityThread.java:141) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.os.Handler.dispatchMessage(Handler.java:99) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.os.Looper.loop(Looper.java:137) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.app.ActivityThread.main(ActivityThread.java:5041) 10-10 16:12:18.586: E/AndroidRuntime(810): at java.lang.reflect.Method.invokeNative(Native Method) 10-10 16:12:18.586: E/AndroidRuntime(810): at java.lang.reflect.Method.invoke(Method.java:511) 10-10 16:12:18.586: E/AndroidRuntime(810): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 10-10 16:12:18.586: E/AndroidRuntime(810): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 10-10 16:12:18.586: E/AndroidRuntime(810): at dalvik.system.NativeStart.main(Native Method) 10-10 16:12:18.586: E/AndroidRuntime(810): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child''s parent first. 10-10 16:12:18.586: E/AndroidRuntime(810): at android.view.ViewGroup.addViewInner(ViewGroup.java:3339) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.view.ViewGroup.addView(ViewGroup.java:3210) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.view.ViewGroup.addView(ViewGroup.java:3186) 10-10 16:12:18.586: E/AndroidRuntime(810): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:289) 10-10 16:12:18.586: E/AndroidRuntime(810): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:279) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.app.Activity.setContentView(Activity.java:1901) 10-10 16:12:18.586: E/AndroidRuntime(810): at com.example.holaamigos.ActivitySaludo.onCreate(ActivitySaludo.java:25) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.app.Activity.performCreate(Activity.java:5104) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 10-10 16:12:18.586: E/AndroidRuntime(810): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 10-10 16:12:18.586: E/AndroidRuntime(810): ... 11 more 10-10 16:12:18.856: D/dalvikvm(810): GC_CONCURRENT freed 134K, 10% free 2630K/2908K, paused 73ms+83ms, total 237ms


¡Solo necesita inicializar su vista en el método onCreate () y luego en onCreateDialog () nuevamente antes de setView () y debería funcionar!


En mi caso, el problema era que estaba intentando agregar la misma vista varias veces al diseño lineal

View childView = LayoutInflater.from(context).inflate(R.layout.lay_progressheader, parentLayout,false); for (int i = 1; i <= totalCount; i++) { parentLayout.addView(childView); }

solo inicie la vista cada vez para solucionar el problema

for (int i = 1; i <= totalCount; i++) { View childView = LayoutInflater.from(context).inflate(R.layout.lay_progressheader, parentLayout,false); parentLayout.addView(childView); }


En mi caso, estaba devolviendo accidentalmente una vista secundaria desde Layout.onCreateView() como se muestra a continuación:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_reject, container, false); Button button = view.findViewById(R.id.some_button); return button; // <-- Problem is this }

La solución fue devolver la vista principal en lugar de la vista secundaria.


En onCreate con activity o onCreateView con fragmento

if (view != null) { ViewGroup parent = (ViewGroup) view.getParent(); if (parent != null) { parent.removeView(view); } } try { view = inflater.inflate(R.layout.fragment_main, container, false); } catch (InflateException e) { }


Encontré este error cada vez que omití un parámetro al inflar la vista de un fragmento en el método onCreateView() manera:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view=inflater.inflate(R.layout.fragment_reject, container); return view; }

La solución es cambiar la línea de inflación de la vista a:

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

La explicación se puede encontrar en la guía de Android para fragmentos

Citando de la guía, el parámetro final en la declaración de inicialización de vista es falso porque:

"el sistema ya está insertando el diseño inflado en el recipiente-pasar verdadero crearía un grupo de vista redundante en el diseño final"


No necesita esta línea: setContentView(txtCambiado);


en ActivitySaludo , esta línea,

setContentView(txtCambiado);

debe configurar la vista de contenido para la actividad solo una vez.


si está agregando la misma vista repetidamente en un ciclo for ... si este es el caso, intente crear el objeto View del diseño dentro del ciclo for. y agrega la vista en el lado del bucle for

Para evitar tales problemas


Intenta de esta manera, espero que esto te ayude a resolver tu problema.

TextView textView = new TextView(this); textView.setText("CustomTextView"); addContentView(textView,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));