Android碎片(与2.3.3兼容包)创build“指定的孩子已经有一个父错误”

我正在使用兼容性包在我的Android应用程序中使用片段。 我已经在运行2.3.3和Google API 2.2仿真器的Nexus One上testing了应用程序。

通过布局XML添加片段时,效果很好(使用片段标签)。

当将片段dynamic添加到FrameLayout中时,它不会成功将片段添加到容器,并且会引发以下错误。

alStateException: The specified child already has a parent. You must call removeView() on the child's parent first 

下面是完整的堆栈跟踪。

 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.view.ViewGroup.addViewInner(ViewGroup.java:1976) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.view.ViewGroup.addView(ViewGroup.java:1871) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.view.ViewGroup.addView(ViewGroup.java:1828) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.view.ViewGroup.addView(ViewGroup.java:1808) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:743) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:933) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:578) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1219) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:380) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.os.Handler.handleCallback(Handler.java:587) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.os.Handler.dispatchMessage(Handler.java:92) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.os.Looper.loop(Looper.java:123) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at android.app.ActivityThread.main(ActivityThread.java:3839) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at java.lang.reflect.Method.invokeNative(Native Method) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at java.lang.reflect.Method.invoke(Method.java:507) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): at dalvik.system.NativeStart.main(Native Method) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): FATAL EXCEPTION: main 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.view.ViewGroup.addViewInner(ViewGroup.java:1976) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.view.ViewGroup.addView(ViewGroup.java:1871) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.view.ViewGroup.addView(ViewGroup.java:1828) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.view.ViewGroup.addView(ViewGroup.java:1808) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:743) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:933) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:578) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1219) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:380) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.os.Handler.handleCallback(Handler.java:587) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.os.Handler.dispatchMessage(Handler.java:92) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.os.Looper.loop(Looper.java:123) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at android.app.ActivityThread.main(ActivityThread.java:3839) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at java.lang.reflect.Method.invokeNative(Native Method) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at java.lang.reflect.Method.invoke(Method.java:507) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 05-17 19:44:03.528: ERROR/AndroidRuntime(7735): at dalvik.system.NativeStart.main(Native Method) 

这是我使用的布局 – FrameLayout是我插入的容器。

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <HorizontalScrollView android:layout_height="wrap_content" android:layout_width="wrap_content" android:scrollbars="none" android:id="@+id/activity_phone_tabbedview_scroll"> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent"> <Button android:text="Something" android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/tabs" android:textColor="@color/White" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp" android:paddingBottom="10dp" android:textSize="19sp" android:onClick="Something" /> <Button android:layout_width="wrap_content" android:id="@+id/button1" android:layout_height="wrap_content" android:paddingLeft="10dp" android:textColor="@color/White" android:text="Something" android:background="@drawable/tabs" android:paddingBottom="10dp" android:textSize="19sp" android:paddingRight="10dp" android:paddingTop="10dp" android:onClick="Something"></Button> <Button android:layout_width="wrap_content" android:id="@+id/button2" android:layout_height="wrap_content" android:paddingLeft="10dp" android:textColor="@color/White" android:text="Something" android:background="@drawable/tabs" android:paddingBottom="10dp" android:textSize="19sp" android:paddingRight="10dp" android:paddingTop="10dp" android:onClick="Something"></Button> <Button android:text="Something" android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/tabs" android:textColor="@color/White" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp" android:paddingBottom="10dp" android:textSize="19sp" android:onClick="Something"/> </LinearLayout> </HorizontalScrollView> <FrameLayout android:id="@+id/activity_phone_tabbedviewer_fragment_container" android:layout_height="match_parent" android:layout_width="match_parent" android:layout_below="@id/activity_phone_tabbedview_scroll"> </FrameLayout> </RelativeLayout> 

下面是我用来实际插入片段的代码。

 FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); NewsList newsList = new NewsList(); fragmentTransaction.add(R.id.activity_phone_tabbedviewer_fragment_container, newsList); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); fragmentTransaction.commit(); 

有谁知道什么是错的?

你可以发布你的onCreateView(...)方法在NewsList Fragment吗?

我猜你正在调用LayoutInflater.inflate(...) 。 如果是这样,你需要使用重载版本,并传递attachToRootfalse因为View将被添加到Fragment.replace(...)调用中的attachToRoot ,所以不应该在通货膨胀期间附加。

非常感谢! 为了使它更微不足道,下面是这对我如何工作:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Call the specific overload of inflate return inflater.inflate(R.layout.frag_layout, null, false); }