java.lang.IllegalStateException:指定的子项已经有父项

当我第一次实例化片段时,我正在使用片段。 但第二次我得到这个例外。 我无法find我得到错误的路线?

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) 

这里是我点击我的列表片段的元素时所做的。

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

第一次是好的,我从列表中点击element2,也没关系; 但是当我回到元素1时,我得到了这个错误。

感谢大家!

当你在你的RouteSearchFragment类中重写OnCreateView时,你有没有

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

代码段?

如果是这样,删除返回语句应该可以解决您的问题。

抱歉发布到一个旧的问题,但我能够解决它使用完全不同的解决scheme。 我得到这个exception,但我改变了我的onCreatView覆盖的第一行:

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

对此:

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

我不知道为什么,但使用接受布尔值的覆盖作为第三个参数固定它。 我认为它告诉片段和/或活动不要使用“容器”作为新创build的视图的父项。 HTH!

我很多时候都面临这个问题。 请添加以下代码以解决此问题:

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

谢谢

如果你有这个声明..

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

然后尝试这个..添加假作为第三个参数..可能是它可以帮助..

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

我把这段代码放在一个片段中,如果我试图回到这个片段,它就会崩溃

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

在收集这个线程的答案后,我意识到,mRootView的父母仍然有mRootView作为孩子。 所以,这是我的修复。

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

希望这可以帮助

当onCreateView()返回的视图不是被夸大的视图时,也会发生这种情况。

例:

 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; 

固定:

 return rootView; 

代替:

 return textView; // or whatever you returned 

我有这个问题,并不能解决它在Java代码。 问题是我的XML。

我试图添加一个textView到一个容器,但已经包裹在一个LinearLayout的textView。

这是原始的xml文件:

 <?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> 

您将View添加到layout ,但视图已经在另一个layout 。 一个视图不能在多个地方。

此解决scheme可以帮助:

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