wake-up-neo.com

java.lang.IllegalStateException: Das angegebene untergeordnete Element hat bereits ein übergeordnetes Element

Ich verwende Fragmente, wenn ich es beim ersten Mal instanziieren kann. aber beim zweiten mal bekam ich diese ausnahme. Ich konnte die Zeile nicht finden, in der der Fehler aufgetreten ist.

 04-04 08:51:54.320: E/AndroidRuntime(29713): FATAL EXCEPTION: main
    04-04 08:51:54.320: E/AndroidRuntime(29713): Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.view.ViewGroup.addViewInner(ViewGroup.Java:3013)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.view.ViewGroup.addView(ViewGroup.Java:2902)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.view.ViewGroup.addView(ViewGroup.Java:2859)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.view.ViewGroup.addView(ViewGroup.Java:2839)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.support.v4.app.NoSaveStateFrameLayout.wrap(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.support.v4.app.BackStackRecord.run(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.support.v4.app.FragmentManagerImpl.execPendingActions(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.support.v4.app.FragmentManagerImpl$1.run(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.os.Handler.handleCallback(Handler.Java:587)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.os.Handler.dispatchMessage(Handler.Java:92)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.os.Looper.loop(Looper.Java:132)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Android.app.ActivityThread.main(ActivityThread.Java:4126)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Java.lang.reflect.Method.invokeNative(Native Method)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at Java.lang.reflect.Method.invoke(Method.Java:491)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:844)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:602)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at dalvik.system.NativeStart.main(Native Method)

Hier ist was ich mache, wenn ich auf ein Element meines Listenfragments klicke.

// If we are not currently showing a fragment for the new
 // position, we need to create and install a new one.
 RouteSearchFragment df = RouteSearchFragment.newInstance(index);

 // Execute a transaction, replacing any existing fragment
 // with this one inside the frame.
 FragmentTransaction ft = fragmentManager.beginTransaction();
 ft.replace(R.id.details_full, df);
 ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
 ft.commit();

Das erste Mal ist es OK, ich klicke auf element2 aus der Liste, es ist auch ok; Aber als ich zu element1 zurückkehrte, bekam ich diesen Fehler.

Vielen Dank an alle!

88
haythem souissi

Wenn Sie OnCreateView in Ihrer RouteSearchFragment-Klasse überschreiben, haben Sie die 

if(view != null) {
    return view; 
}

codesegment?

In diesem Fall sollte das Problem durch das Entfernen der Rückgabeanweisung behoben werden.

Sie können den Code beibehalten und die Ansicht zurückgeben, wenn Sie die Ansichtsdaten nicht regenerieren möchten. Mit der OnDestroyView () - Methode entfernen Sie diese Ansicht wie folgt aus ihrem übergeordneten Element:

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

Es tut mir leid, zu einer alten Frage zu posten, aber ich konnte sie mit einer völlig anderen Lösung beheben. Ich habe diese Ausnahme erhalten, aber ich habe die erste Zeile meiner onCreatView-Überschreibung davon geändert:

View result = inflater.inflate(R.layout.customer_layout, container);

... dazu:

View result = inflater.inflate(R.layout.customer_layout, container, false);

Ich habe keine Ahnung warum, aber mit der Überschreibung, die den Boolean als dritten Parameter akzeptiert, wurde das Problem behoben. Ich denke, es sagt dem Fragment und/oder der Aktivität, den "Container" nicht als übergeordnetes Element der neu erstellten Ansicht zu verwenden. HTH!

364
Patrick

Ich habe dieses Problem viele Male angegangen ... Bitte fügen Sie den folgenden Code hinzu, um dieses Problem zu beheben:

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

Vielen Dank

43
Hardik

Wenn Sie diese Aussage haben ..

View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect 

Dann probieren Sie das .. Fügen Sie als drittes Argument falsch hinzu. Vielleicht könnte es helfen.

View view = inflater.inflate(R.layout.fragment1, container, false);//correct one
34
Dhananjay M

Ich hatte diesen Code in einem Fragment und es stürzte ab, wenn ich versuche, auf dieses Fragment zurückzukommen

if (mRootView == null) {
    mRootView = inflater.inflate(R.layout.fragment_main, container, false);
} 

nachdem ich die Antworten in diesem Thread gesammelt hatte, wurde mir klar, dass die übergeordneten Elemente von mRootView immer noch mRootView als untergeordnetes Element haben. Das war also meine Lösung.

if (mRootView == null) {
    mRootView = inflater.inflate(R.layout.fragment_main, container, false);
} else {
    ((ViewGroup) mRootView.getParent()).removeView(mRootView);
}

hoffe das hilft

21
user1736525

Dies geschieht auch, wenn die von onCreateView () zurückgegebene Ansicht nicht die aufgeblasene Ansicht ist.

Beispiel:

View rootView = inflater.inflate(R.layout.my_fragment, container, false);

TextView textView = (TextView) rootView.findViewById(R.id.text_view);
textView.setText("Some text.");

return textView;

Fix:

return rootView;

Anstatt:

return textView; // or whatever you returned
15
Mateus Pires

Ich hatte dieses Problem und konnte es nicht mit Java-Code lösen. Das Problem war mit meiner XML.

Ich habe versucht, einem Container eine TextView hinzuzufügen, hatte jedoch die TextView in ein LinearLayout eingebunden.

Dies war die ursprüngliche XML-Datei:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    
    <TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@Android:id/text1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:textAppearance="?android:attr/textAppearanceListItemSmall"
        Android:gravity="center_vertical"
        Android:paddingLeft="16dp"
        Android:paddingRight="16dp"
        Android:textColor="#fff"
        Android:background="?android:attr/activatedBackgroundIndicator"
        Android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

</LinearLayout>

Jetzt mit dem LinearLayout entfernt:

<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@Android:id/text1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:textAppearance="?android:attr/textAppearanceListItemSmall"
        Android:gravity="center_vertical"
        Android:paddingLeft="16dp"
        Android:paddingRight="16dp"
        Android:textColor="#fff"
        Android:background="?android:attr/activatedBackgroundIndicator"
        Android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

Das schien mir nicht besonders viel zu sein, aber es hat den Trick gemacht und ich habe meinen Java-Code überhaupt nicht geändert. Es war alles in der XML.

5
DroidCrafter

Sie fügen eine View zu einer layout hinzu, aber die Ansicht befindet sich bereits in einer anderen layout. Eine Ansicht kann nicht an mehreren Stellen sein.

2
noob

Diese Lösung kann helfen:

public class FragmentItem extends Android.Support.V4.App.Fragment
{
    View rootView;
    TextView textView;

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (rootView != null) 
        {
            ViewGroup parent = (ViewGroup)rootView.Parent;
            parent.RemoveView(rootView);
        } else {
            rootView = inflater.Inflate(Resource.Layout.FragmentItem, container, false);
            textView = rootView.FindViewById<TextView>(Resource.Id.textViewDisplay);            
        }
        return rootView;
    }
}
1

Ich habe es gelöst, indem Sie attachToRoot von inflater.inflate() auf false setzen.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_overview, container, false);
    return view;
}
0
Mr. B.

in Ihrer XML-Datei sollten Sie layout_width und layout_height von wrap_content auf match_parent setzen. es ist für mich behoben.

<FrameLayout
        Android:id="@+id/container"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />
0
Evan Ngo