2011-05-17 13 views
39

Estoy usando fragmentos en mi aplicación Android usando el paquete de compatibilidad. He probado la aplicación en un Nexus One con 2.3.3 y un emulador Google API 2.2.Fragmento de Android (con el paquete de compatibilidad en 2.3.3) crea "El hijo especificado ya tiene un error principal"

Al agregar el fragmento a través del diseño XML, funciona muy bien (usando una etiqueta de fragmento).

Al agregar el fragmento dinámicamente en FrameLayout, no agrega correctamente el fragmento al contenedor y arroja el siguiente error.

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

Pila completa para esto está por debajo.

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) 

Este es el diseño que estoy usando - FrameLayout es el contenedor en el que estoy insertando.

<?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> 

El código que estoy usando para insertar realmente el fragmento está a continuación.

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

¿Alguien tiene alguna idea de lo que está mal?

Respuesta

134

¿Se puede publicar el contenido de su método onCreateView(...) en el NewsListFragment?

Supongo que está llamando al LayoutInflater.inflate(...) en algún momento. Si es así, debe usar el overloaded version y pasar attachToRoot como false ya que el View se agregará a la jerarquía en la llamada Fragment.replace(...), por lo que no se debe conectar durante el inflado.

+0

Gracias Nick, esa sugerencia funcionó a la perfección. Agregar falso para que use la versión sobrecargada funcionó. – Tom

+0

¡Eso me gustó! –

+0

Maldita sea. Perdí tantas horas para arreglar esto y fue una cuestión de 'falso'. ¡Gracias! –

11

¡Muchas gracias! Para hacerlo más trivial, así es como funcionó esto para mí:

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

incluso estoy usando así también obteniendo el error View view = inflater.inflate (R.layout.fragment_chats, null, false); –

Cuestiones relacionadas