web-dev-qa-db-fra.com

Fragments - L'enfant spécifié a déjà un parent. Vous devez d'abord appeler removeView () sur le parent de l'enfant.

Je reçois cette erreur. J'ai essayé beaucoup de solutions mais je ne pouvais pas résoudre ceci. Aidez moi! J'ai besoin d'ajouter la vue de surface et le bouton à l'activité à l'aide de fragments. 

CamActivity.Java:

public class CamActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cam);

        FragmentManager fm = getSupportFragmentManager();

        Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);

        if(fragment == null) {
            fragment = new CamFragment();
            fm.beginTransaction()
            .add(R.id.fragmentContainer, fragment)
            .commit();
        }
    }
}

CamFragment.Java:

public class CamFragment extends Fragment {

    private static final String TAG = "CamFragment";

    private Camera mCamera;
    private SurfaceView mSurfaceView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
    View v = inflater.inflate(R.layout.camera_fragment, parent);

    Button capturePic = (Button)v.findViewById(R.id.img_capture);
    capturePic.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            getActivity().finish();
        }
    });

    mSurfaceView = (SurfaceView)v.findViewById(R.id.surfaceView1);
    return v;
}

}

Erreur:

04-18 13:24:12.735: E/AndroidRuntime(6321): FATAL EXCEPTION: main
04-18 13:24:12.735: E/AndroidRuntime(6321): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pack.camdictionary/com.pack.camdictionary.CamActivity}: Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1728)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1747)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.app.ActivityThread.access$1500(ActivityThread.Java:155)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:993)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.os.Handler.dispatchMessage(Handler.Java:130)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.os.Looper.loop(SourceFile:351)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.app.ActivityThread.main(ActivityThread.Java:3814)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Java.lang.reflect.Method.invokeNative(Native Method)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Java.lang.reflect.Method.invoke(Method.Java:538)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:901)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:659)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at dalvik.system.NativeStart.main(Native Method)
04-18 13:24:12.735: E/AndroidRuntime(6321): Caused by: Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.view.ViewGroup.addViewInner(ViewGroup.Java:2007)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.view.ViewGroup.addView(ViewGroup.Java:1902)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.view.ViewGroup.addView(ViewGroup.Java:1859)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.view.ViewGroup.addView(ViewGroup.Java:1839)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.Java:40)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:931)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1104)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:682)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1467)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.support.v4.app.FragmentActivity.onStart(FragmentActivity.Java:570)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.app.Instrumentation.callActivityOnStart(Instrumentation.Java:1166)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.app.Activity.performStart(Activity.Java:3837)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1701)
04-18 13:24:12.735: E/AndroidRuntime(6321):     ... 11 more
69
Vivek

Essayez de remplacer 

View v = inflater.inflate(R.layout.camera_fragment, parent);

Avec

View v = inflater.inflate(R.layout.camera_fragment, parent, false);

ou 

View v = inflater.inflate(R.layout.camera_fragment, null);
172
user3390963

On a déjà répondu à cette question, mais j'aimerais quand même ajouter la raison de l'ajout de false comme troisième paramètre.

La méthode inflate () prend trois arguments:

  • L'ID de ressource de la présentation que vous souhaitez gonfler.
  • Le ViewGroup doit être le parent de la disposition gonflée. Le passage du conteneur est important pour que le système applique les paramètres de présentation à la vue racine de la présentation gonflée, spécifiée par la vue parente dans laquelle il est inséré.
  • Un booléen indiquant si la présentation gonflée doit être attachée au ViewGroup (le deuxième paramètre) pendant l'inflation. (Dans ce cas, la valeur est false car le système insère déjà la présentation gonflée dans le conteneur. Si vous transmettez true, vous créez un groupe de vues redondant dans la présentation finale.)

Source: http://developer.Android.com/guide/components/fragments.html

8
Bharat Kul Ratan

J'utilise l'API 26.0.2 et dans mon cas, le crash était dû à des animations personnalisées définies pour mes fragments. Commenter l'appel pour définir l'animation personnalisée, corrige le problème.

fragmentTransaction.setCustomAnimations (Android.R.anim.fade_in, Android.R.anim.fade_out);

4
Satheesh

Spécifiez Id pour les éléments parent et enfant, en particulier pour les vues personnalisées, dans le fichier xml peut résoudre le problème.

0

Juste pour ta culture. Cela semble être un problème dans le SDK Android.

J'ai la même situation que @Satheesh avec la version du SDK: 27.0.2 et essayer de supprimer le setCustomAnimation semble fonctionner Mais pour supprimer setCustomAnimations, il me faut beaucoup de changements, je préférerais conserver l'animation personnalisée. Ce que j'ai fait est de mettre à niveau le SDK vers la dernière version qui est 27.1.1 pour le moment. Et cela fonctionne pour moi.

0
Pai-Hsiang Huang

Pourrait être utile

           View customView1;
           inflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           customView1= inflater.inflate(R.layout.edit_custom_alert_window, null);     
           try {
                if(customView2.getParent()!=null)
                    ((ViewGroup)customView2.getParent()).removeView(customView2);
            }catch (Exception e){

            }
0
Muhaiminurabir

J'ai également rencontré ce problème, et c'est ma solution. c'est très facile

View v;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    if (v == null) {
        v = inflater.inflate(R.layout.camera_fragment, container);
    } else {
        ViewGroup parent = (ViewGroup) v.getParent();
        if (parent != null) {
            parent.removeView(v);
        }
    }
    return v;
}

J'espère vous être utile

0
AnhSang