2011-04-14 13 views
100

Tengo un fragmento dentro de una actividad de grupo y quiero reemplazarlo con otro fragmento:Sustitución de un fragmento con otro fragmento en el interior del grupo de actividades

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction(); 
SectionDescriptionFragment bdf = new SectionDescriptionFragment(); 
ft.replace(R.id.book_description_fragment, bdf); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.addToBackStack(null); 
ft.commit(); 

Funciona bien cuando se hace como un proyecto independiente sin usar grupo de actividades, todo funciona bien en log cat ya que el control va dentro de getview(), pero no hay vista visible, ni siquiera se produce una excepción, quiero que el fragmento de detalles del libro sea reemplazado por el fragmento de detalle de la sección.

Xml de fragmento de detalle de libro tiene id book_description_fragment y xml para fragmento de descripción de sección tiene id section_description_fragment.

El código anterior está en el método de clic de un elemento, quiero que cuando el usuario toque un elemento en la vista de desplazamiento horizontal, el fragmento cambie.

Respuesta

28

favor ver este Question

Sólo se puede sustituir a un "fragmento de añadido dinámicamente".

Por lo tanto, si desea agregar un fragmento dinámico, consulte el ejemplo this.

+1

Hola. He descubierto la solución, en realidad no estaba colocando el contenido del fragmento en un diseño, en cambio estaba usando otro fragmento para el contenido del fragmento anterior –

+0

No, aquí estaba buscando reemplazar el fragmento completo con un nuevo fragmento. – Sana

+1

@Lion Heart, ¿Podría elaborar la solución que encontró, por favor? – Namratha

202

Los fragmentos que están codificados en XML, no se pueden reemplazar. Si necesita reemplazar un fragmento por otro, debe haberlos agregado dinámicamente, en primer lugar.

Nota: R.id.fragment_container es un diseño o contenedor de su elección en la actividad a la que va a llevar el fragmento.

// Create new fragment and transaction 
Fragment newFragment = new ExampleFragment(); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

// Replace whatever is in the fragment_container view with this fragment, 
// and add the transaction to the back stack if needed 
transaction.replace(R.id.fragment_container, newFragment); 
transaction.addToBackStack(null); 

// Commit the transaction 
transaction.commit(); 
+7

¿qué es el R.id.fragment_container en este caso? – Guy

+3

@Guy, puede ser cualquier diseño en el que desee cargar el fragmento. –

+52

Gracias, amigo ... "Los fragmentos que están codificados en XML, no se pueden reemplazar". Esta línea hizo mi día ... – Jomia

7

que he hecho una esencia con el método perfecto para gestionarfragmentoreemplazo y ciclo de vida.

Solo reemplaza el fragmento actual por uno nuevo, si no es el mismo y si no está en la pila posterior (en este caso, se abrirá).

Contiene varias opciones como si quisiera que el fragmento se guarde en backstack.

=>See Gist here

El uso de este y una sola actividad, es posible que desee agregar esto a su actividad:

@Override 
public void onBackPressed() { 
    int fragments = getSupportFragmentManager().getBackStackEntryCount(); 
    if (fragments == 1) { 
      finish(); 
      return; 
    } 

    super.onBackPressed(); 
} 
+0

El enlace ya no está disponible ... –

+1

@ RémiP el enlace está funcionando como se esperaba. Puede marcar este que puede ser mejor IMO https://github.com/HugoGresse/Anecdote/blob/master/app/src/main/java/io/gresse/hugo/anecdote/util/FragmentStackManager.java#L42 –

5

usar el siguiente código en android.support.v4

FragmentTransaction ft1 = getFragmentManager().beginTransaction(); 
    WebViewFragment w1 = new WebViewFragment(); 
    w1.init(linkData.getLink()); 
    ft1.addToBackStack(linkData.getName()); 
    ft1.replace(R.id.listFragment, w1); 
    ft1.commit(); 
4

Utilice este código usando v4

ExampleFragment newFragment = new ExampleFragment();  
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
// Replace whatever is in the fragment_container view with this fragment, 
// and add the transaction to the back stack so the user can navigate back 
transaction.replace(R.id.container, newFragment); 
transaction.addToBackStack(null); 
// Commit the transaction 
transaction.commit(); 
3

Espero que esté bien. Cuando comencé a trabajar con Android Fragments, también estaba teniendo el mismo problema, entonces leí sobre 1- Cómo cambiar el fragmento con otro. 2- Cómo agregar fragmentos si Fragment container no tiene ningún fragmento.

luego después de algunos R & D, he creado una función que me ayuda en muchos proyectos hasta ahora y todavía estoy usando esta sencilla función.

public void switchFragment(BaseFragment baseFragment) { 
    try { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
     if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) { 
      ft.add(R.id.home_frame, baseFragment); 
     } else { 
      ft.replace(R.id.home_frame, baseFragment); 
     } 
     ft.addToBackStack(null); 
     ft.commit(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

disfrutar de su tiempo :) código

1

Uso ViewPager. Es trabajo para mi

final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.vp_pager); 
button = (Button)result.findViewById(R.id.button); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     viewPager.setCurrentItem(1); 
    } 
}); 
Cuestiones relacionadas