Android java.lang.IllegalStateException:指定的子级已具有父级

Android java.lang.IllegalStateException:指定的子级已具有父级,android,android-layout,android-fragments,Android,Android Layout,Android Fragments,当我第一次实例化一个片段时,我使用的是片段。但是第二次我得到了这个例外。我找不到出错的线路了 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 ca

当我第一次实例化一个片段时,我使用的是片段。但是第二次我得到了这个例外。我找不到出错的线路了

 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; 
}
代码段

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

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

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

很抱歉,我发了一个老问题,但我能用一个完全不同的解决方案来解决它。我收到此异常,但我更改了onCreatView覆盖的第一行:

View result = inflater.inflate(R.layout.customer_layout, container);
……为此:

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

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

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

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

谢谢

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

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

希望这有帮助

此解决方案可以帮助:

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;
    }
}
public class FragmentItem扩展了Android.Support.V4.App.Fragment
{
视图根视图;
文本视图文本视图;
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态){
if(rootView!=null)
{
ViewGroup parent=(ViewGroup)rootView.parent;
parent.RemoveView(rootView);
}否则{
rootView=充气机.充气(Resource.Layout.FragmentItem,container,false);
textView=rootView.findviewbyd(Resource.Id.textViewDisplay);
}
返回rootView;
}
}

如果您有此声明

View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect 
那就试试这个。。添加false作为第三个参数。。也许这会有帮助

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

当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 textView; // or whatever you returned

我有这个问题,无法用Java代码解决。问题在于我的xml

我试图将textView添加到容器中,但已将textView包装在LinearLayout中

这是原始xml文件:


在xml文件中,您应该将包裹内容的布局宽度和布局高度设置为与父项匹配。这是为我准备的

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

我通过将
充气机的
attachToRoot
设置为
false
,解决了这个问题

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


需要调用layoutView.removeAllViews();在将视图添加到之前layout@imrankhan错了!您可以添加而不删除所有。最重要的部分丢失了,因为stacktrace中没有自定义包,我建议您删除一些代码并逐步进行测试…我添加了更多详细信息,您能看到吗?这个RouteSearchFragment类是什么??在Android文档中找不到任何引用。请也更新类定义。我在问题中添加了更多详细信息,您能看到吗?@Override public void onDestroyView(){super.onDestroyView();ViewGroup parentViewGroup=(ViewGroup)mRoutesSearchViewContainer.getParent();if(null!=parentViewGroup){parentViewGroup.removeView(mRoutesSearchViewContainer)}@Medo:你能简单解释一下吗。我有相同的错误显示在日志猫。正如您提出的建议“删除return语句应该可以解决您的问题”,但我们需要在onCreateView()方法中返回视图对象。你能为你的解释提供代码片段吗。谢谢你。@Krishna只是像你平常一样膨胀并返回视图。你可以跳过整个if语句。对我来说,我只需要替换
return inflater.inflate(R.layout.fragment\u search,container)使用
返回充气机。充气(R.layout.fragment\u搜索,容器,错误)不要抱歉-这对我非常有用,显然对其他许多人也很有用。谢谢非常感谢,我总是忘记这一点,然后又回到这一点answer@Patrick,第一个将充气视图附加到容器,添加false标志表示您不想将充气视图添加到容器中。我一直回到这篇文章,发现这就是答案:)谢谢您的解决方案:)我有一个非常特殊的情况,我不能使用充气器来解决这个问题。你为我节省了很多时间对不起,我不太明白,因为我是android新手;视图对象从何而来?Cristy YG:将视图实例作为全局变量,并在上面的全局变量上膨胀布局xml。您是否在跟踪我?是的,查看实例声明为全局。+1帮助了我。如果您的活动保持不变,但片段管理器正在顶部添加新片段,则尤其如此。当它返回到第一个片段时,需要确保删除旧的根视图。谢谢这对我帮助很大。我三天来一直在寻找解决方案。简单而漂亮的答案。哇!我终于成功了!格拉特溶液。谢谢我没有理由解释为什么“(ViewGroup)mRootView.getParent()).removeView(mRootView);“与直接调用.removeView(mRootView)不同”,但这对我也有效,我正在Android 8.0和9.0上测试。谢谢bud^我认为rootView将始终为空,因为您没有这样做
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_overview, container, false);
    return view;
}