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