我正在使用片段,当我第一次实例化片段时。但第二次我得到了这个例外。我找不到出错的地方?
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,它也没关系;但是当我回到element1时,我遇到了这个错误。
谢谢大家!
答案 0 :(得分:366)
很抱歉发布一个旧问题,但我能够使用一个完全不同的解决方案来修复它。我得到了这个异常,但我改变了我的onCreatView覆盖的第一行:
View result = inflater.inflate(R.layout.customer_layout, container);
......对此:
View result = inflater.inflate(R.layout.customer_layout, container, false);
我不知道为什么但是使用接受布尔值的覆盖作为第三个参数修复它。我认为它告诉Fragment和/或Activity不要使用“容器”作为新创建的View的父级。 HTH!
答案 1 :(得分:43)
我多次面对这个问题。 请添加以下代码以解决此问题:
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parentViewGroup = (ViewGroup) view.getParent();
if (parentViewGroup != null) {
parentViewGroup.removeAllViews();
}
}
}
由于
答案 2 :(得分:34)
如果你有这个陈述..
View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect
然后尝试这个..添加false作为第三个参数..可能它可以帮助..
View view = inflater.inflate(R.layout.fragment1, container, false);//correct one
答案 3 :(得分:29)
当您在OnCreateView
课程中覆盖RouteSearchFragment
时,是否有
if(view != null) {
return view;
}
代码段?
如果是这样,删除return语句可以解决您的问题。
如果您不想重新生成视图数据,可以保留代码并返回视图;如果不是,则可以从onsttroyView()方法中删除此视图:
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeAllViews();
}
}
}
答案 4 :(得分:21)
我将这段代码放在一个片段中,如果我尝试回到这个片段,它就会崩溃
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);
}
希望这会有所帮助
答案 5 :(得分:15)
当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
答案 6 :(得分:5)
我遇到了这个问题,无法用Java代码解决它。问题出在我的xml上。
我试图将textView添加到容器中,但是已将textView包装在LinearLayout中。
这是原始的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>
&#13;
现在删除了LinearLayout:
<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"/>
&#13;
这对我来说似乎并不多,但它确实起到了作用,我根本没有改变我的Java代码。它全部在xml中。
答案 7 :(得分:2)
您要在View
中添加layout
,但视图已在另一个layout
中。视图不能在多个位置。
答案 8 :(得分:1)
此解决方案可以提供帮助:
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;
}
}
答案 9 :(得分:0)
在您的xml文件中,您应该将wrap_content的layout_width和layout_height设置为match_parent。对我来说是固定的。
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
答案 10 :(得分:0)
我通过将attachToRoot
中的inflater.inflate()
设置为false
来解决了这个问题。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_overview, container, false);
return view;
}