99

我正在使用片段,当我第一次实例化片段时。但我第二次得到这个例外。我找不到出现错误的行?

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

第一次就ok了,我点list中的element2,也ok;但是当我返回 element1 时,我得到了这个错误。

谢谢大家!

4

11 回答 11

369

很抱歉发布一个旧问题,但我能够使用完全不同的解决方案来解决它。我遇到了这个异常,但我改变了 onCreatView 覆盖的第一行:

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

...对此:

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

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

于 2012-10-19T00:47:40.613 回答
45

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

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

谢谢

于 2013-04-15T11:54:50.517 回答
36

当您在课堂上覆盖OnCreateView时,您RouteSearchFragment是否有

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

代码段?

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

如果您不想重新生成视图数据,则可以保留代码并返回视图,并且 onDestroyView() 方法可以从其父视图中删除此视图,如下所示:

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (view != null) {
            ViewGroup parent = (ViewGroup) view.getParent();
            if (parent != null) {
                parent.removeAllViews();
            }
        }
    }
于 2012-04-04T12:09:36.360 回答
35

如果你有这个说法..

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

然后试试这个.. 添加 false 作为第三个参数.. 可能会有所帮助..

View view = inflater.inflate(R.layout.fragment1, container, false);//correct one
于 2014-07-18T07:52:00.613 回答
22

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

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

希望这可以帮助

于 2013-09-04T11:29:51.843 回答
16

当 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
于 2014-12-19T20:37:24.803 回答
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>

现在删除了 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"/>

这对我来说似乎并不多,但它确实起到了作用,而且我根本没有更改我的 Java 代码。这一切都在xml中。

于 2015-10-13T14:00:38.497 回答
2

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

于 2012-04-04T08:21:17.203 回答
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;
    }
}
于 2014-06-18T06:32:11.520 回答
1

我通过设置to解决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;
}
于 2018-09-26T10:45:59.413 回答
0

在您的 xml 文件中,您应该将 layout_width 和 layout_height 从 wrap_content 设置为 match_parent。它对我来说是固定的。

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
于 2018-07-15T07:38:32.457 回答