Фрагмент Android (с пакетом совместимости 2.3.3) создает «У указанного ребенка уже есть родительская ошибка»

Я использую фрагменты в своем приложении для Android, используя пакет совместимости. Я протестировал приложение на Nexus One под управлением 2.3.3 и эмулятора Google API 2.2.

При добавлении фрагмента через XML-макет он отлично работает (с использованием тега фрагмента).

При динамическом добавлении фрагмента в 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> - <?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(); 

Кто-нибудь знает, что не так?

Solutions Collecting From Web of "Фрагмент Android (с пакетом совместимости 2.3.3) создает «У указанного ребенка уже есть родительская ошибка»"

Можете ли вы опубликовать содержимое своего onCreateView(...) в Fragment NewsList ?

Я предполагаю, что вы вызываете LayoutInflater.inflate(...) в какой-то момент. Если это так, вам нужно использовать перегруженную версию и передать attachToRoot как false как View будет добавлено в иерархию в вызове Fragment.replace(...) , поэтому его нельзя прикреплять во время инфляции.

Большое спасибо! Чтобы сделать это более тривиальным, вот как это сработало для меня:

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