2011-10-27 14 views
14

No he podido encontrar la manera de agregar fragmentos dinámicamente en fragmentos existentes añadidos dinámicamente. ¿Sabes si es posible?Agregue fragmentos de forma dinámica en el fragmento

estoy generando fragmentos de esta manera:

FragmentManager fragMgr = getSupportFragmentManager(); 
FragmentTransaction xact = fragMgr.beginTransaction(); 

if(null == fragMgr.findFragmentByTag(FRAG1_TAG)) { 
    xact.add(10101010, new DateTime(), FRAG1_TAG); 
} 

if(null == fragMgr.findFragmentByTag(FRAG4_TAG)) { 
    xact.add(7777, new loginForm(), FRAG4_TAG); 

} 

xact.commit(); 

cómo agregar en el fragmento FRAG4_TAG otro?

Edit2:

que no modificables su ID para poder trabajar con él en el futuro (donde ll es mi LinearLayout en XML):

FrameLayout frml4 = (FrameLayout)inflater.inflate(R.layout.frame,null); 
frml4.setId(7777); 
frml4.setBackgroundColor(Color.YELLOW); 

ll.addView(frml4); 
+2

¿lo intentó? No creo que si es posible, el fragmento no puede contener otro fragmento ... use Views para eso (me enfrento al mismo isuse ... ya tengo fragmentos, llamemos a LeftListView y DetailsPane ahora que wana tiene ViewPager en DetailsPane. ... entonces construyo un fragmento para cada página del Buscapersonas ... pero siempre termina con un error en el compromiso de la transacción ... después de algunas investigaciones encontré este http: // stackoverflow.com/questions/5268361/fragments-in-action-bar-tab-fragments – Selvin

+0

Sí lo he intentado, pero no fue exitoso. Gracias por comentar – Waypoint

+0

http://stackoverflow.com/questions/7700226/display-fragment-viewpager-within-a-fragment/7700305#7700305, compruebe si esta solución funciona para usted. es un trabajo para insertar el fragmento de uso dentro de otro fragmento. –

Respuesta

32

Supongo que el problema con el que se está encontrando es que no hay una vista inflada para agregar el fragmento porque el fragmento original, FRAG4_TAG, no se ha inflado antes de intentar agregarlo.

Puede pasar suficiente información a FRAG4_TAG en los argumentos para hacerle saber que debe crear y agregar un fragmento (o todos los fragmentos que necesite) a sí mismo durante su estado en CreateView, después de que la vista se haya inflado. ..

la disposición para la actividad ...

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="MyActivity"/> 

    <LinearLayout 
     android:orientation="vertical" 
     android:id="@+id/main_frag_container" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
</LinearLayout> 

la actividad ...

public class MyActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 

     Fragment fragOne = new MyFragment(); 
     Bundle arguments = new Bundle(); 
     arguments.putBoolean("shouldYouCreateAChildFragment", true); 
     fragOne.setArguments(arguments); 
     ft.add(R.id.main_frag_container, fragOne); 
     ft.commit(); 

    } 
} 

la disposición para el fragmento ...

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="20dp"> 
    <TextView 
     android:id="@+id/text" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Some fragment"/> 

    <LinearLayout 
     android:orientation="vertical" 
     android:id="@+id/frag_container" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
</LinearLayout> 

El fragmento ...

public class MyFragment extends Fragment { 
    @Override 
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { 
     ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.frag_layout, container, false); 

     boolean shouldCreateChild = getArguments().getBoolean("shouldYouCreateAChildFragment"); 

     if (shouldCreateChild) { 
      FragmentManager fm = getFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 

      fm.beginTransaction(); 
      Fragment fragTwo = new MyFragment(); 
      Bundle arguments = new Bundle(); 
      arguments.putBoolean("shouldYouCreateAChildFragment", false); 
      fragTwo.setArguments(arguments); 
      ft.add(R.id.frag_container, fragTwo); 
      ft.commit(); 

     } 

     return layout; 
    } 
} 

Este ejemplo cubre el caso en que es necesario agregar dinámicamente fragmentos a un fragmento que no haya sido inflado y se añade a la jerarquía. Agregar un fragmento a un fragmento que ya ha sido inflado y agregado a la jerarquía es tan simple como simplemente especificar el contenedor de fragmentos de destino que desea agregar por ID como lo haría normalmente.

+0

http://stackoverflow.com/q/18097567/1503130 me puede ayudar con esto – Prateek

+3

Asegúrese de utilizar getChildFragmentManager en lugar de getFragmentManager para agregar fragmentos secundarios. –

+0

¿Cómo es que llamas a beginTransaction() dos veces? – nenchev

1

no se puede insertar fragmentos en otros fragmentos. (Al menos, aún no)

Sin embargo, puede reemplazar Fragmentos con otros Fragmentos con FragmentTransaction.replace(containerViewId, Fragment).

+0

Ok, gracias, no encontré ninguna información en la web. – Waypoint

+12

Los fragmentos pueden contener fragmentos. Consulte mi respuesta ... –

3

Como dice la documentación "Un fragmento siempre debe estar incrustado en una actividad". Así que cuando agrega un "subfragmento", siempre pertenecerá a la actividad, incluso si la agrega dentro de su clase de fragmento. Por ejemplo, si luego decide eliminar el fragmento que lo contiene, los subfragmentos no se eliminarán automáticamente. Cuando tuve que hacer lo mismo tuve que almacenar en un vector los subfragmentos y eliminarlos manualmente en los métodos onDestroy de mi fragmento de contenedor.

Creo que los fragmentos no se piensan para ser utilizados como esto

+1

Estoy totalmente de acuerdo con esto. Mi ejemplo anterior * NO * maneja la limpieza. Tendrás que hacer tu propia tarea en eso. –

Cuestiones relacionadas