Je crée ce post parce que je suis nouveau dans ce domaine et que j'ai besoin d'un peu d'aide. Je fais un petit exercice sur une application qui vous a mis votre nom, et elle renvoie "bonjour (le nom que vous avez mis)". Mais après avoir appuyé sur le bouton, le message d'erreur suivant s'affiche: "L'enfant spécifié a déjà un parent. Vous devez d'abord appeler removeView () sur le parent de l'enfant"
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
Dans onCreate with activity ou onCreateView avec fragment
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) {
}
dans ActivitySaludo
, cette ligne,
setContentView(txtCambiado);
vous ne devez définir l'affichage du contenu de l'activité qu'une seule fois.
Vous n'avez pas besoin de cette ligne: setContentView(txtCambiado);
Dans mon cas, je renvoyais accidentellement une vue enfant de Layout.onCreateView()
comme indiqué ci-dessous:
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 solution consistait à renvoyer la vue parent au lieu de la vue enfant.
Dans mon cas, le problème était que j'essayais d'ajouter plusieurs fois la même vue à une présentation linéaire.
View childView = LayoutInflater.from(context).inflate(R.layout.lay_progressheader, parentLayout,false);
for (int i = 1; i <= totalCount; i++) {
parentLayout.addView(childView);
}
il suffit d'initialiser la vue à chaque fois pour résoudre le problème
for (int i = 1; i <= totalCount; i++) {
View childView = LayoutInflater.from(context).inflate(R.layout.lay_progressheader, parentLayout,false);
parentLayout.addView(childView);
}
si vous ajoutez la même vue à plusieurs reprises dans une boucle for. Si c'est le cas, essayez de créer l'objet View de la présentation dans la boucle for. et ajouter la vue dans la boucle for
Pour éviter de tels problèmes
Essayez de cette façon, espérons que cela vous aidera à résoudre votre problème.
TextView textView = new TextView(this);
textView.setText("CustomTextView");
addContentView(textView,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Vous devez juste initialiser votre vue dans la méthode onCreate () puis à nouveau dans onCreateDialog () avant setView () et cela devrait fonctionner!
frameLayout.addView (yourView); <----- si vous obtenez une erreur sur cette ligne, supprimez d'abord la vue de son parent
if (yourView.getParent ()! = null)
((ViewGroup) yourView.getParent ()). RemoveView (yourView); FrameLayout.addView (yourView); (Ajouter la vue à la mise en page)
J'ai rencontré cette erreur alors qu'il y avait une vue invisible dans une présentation XML d'activité. A cette époque, il n'était pas utilisé dans mon cas, je l'ai donc retiré et le crash ne se voit plus.