2011-06-15 10 views
6

En la tableta tenemos dos fragmentos (dos vistas diferentes de los mismos datos) que se encuentran uno al lado del otro. En dispositivos móviles, nos gustaría cambiar entre estos dos fragmentos con solo presionar un botón. La disposición móvil se ve algo como esto:Intercambiando fragmentos en una sola actividad?

<RelativeLayout> 
    <fragment id="container" name="fragA"/> 
    <ImageButton onClick="swapFragments" /> 
</RelativeLayout> 

En el método de la actividad swapFragments(View), Estoy intentando utilizar el FragmentManager para reemplazar fragA con fragB:

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(R.id.container, new FragB()); 
fragmentTransaction.commit(); 

... pero siempre puedo ver fragA a través de las partes transparentes de fragB, lo que me lleva a creer que solo está poniendo fragB en la parte superior de fragA, no reemplazándolo.

Estoy empezando por la ruta de usar hide(Fragment) y métodos similares en la transacción, pero esa no parece ser la forma correcta de hacerlo.

¿Algún consejo sobre cómo intercambiar estos fragmentos de la manera correcta?

Editar: Vi la respuesta a this question. Esto me confunde, sin embargo, ya que necesito poder especificar un diseño diferente para la tableta y el teléfono. Si tengo que agregar mediante programación fragmentos, ¿cómo puedo evitar código específico para cada diseño en la actividad (es decir

if(TABLET) { 
    addFragmentA(); 
    addFragmentB(); 
} else { 
    addFragmentA(); 
} 
+0

¿Ha encontrado una solución a este problema? –

Respuesta

0

ve bien a mí, que estoy haciendo algo similar aunque estoy añadiendo mi fragmento inicial de la actividad utilizando add en lugar de tener que cargar refiriéndose a ella en el diseño puede haber un error no FYI estoy usando la biblioteca de compatibilidad

podría ser vale la pena probar:...

1) Añadir a la transacción la pila de respaldo para ver si eso hace la diferencia, parece que de todos modos querrás esa funcionalidad.

2) Déle a su fragmento en el diseño una identificación o etiqueta, luego use eso para realizar un remove y add fragB en su lugar.

3) Intente cargar su fragA desde el código en su lugar y ver si eso hace la diferencia.

0

bueno, antes que nada puedes intentar usar el método de fábrica newInstance() para crear una instancia del fragmento B y no solo del nuevo FragB(). Sin embargo, creo que este no es el problema.

¿Puede simplemente tratar de no utilizar en su diseño XML la etiqueta del fragmento? Sólo hacer algo como esto:

<RelativeLayout> 
    <Linear/FrameLayout id="container" name="fragA"/> 
    <ImageButton onClick="swapFragments" /> 
</RelativeLayout> 

lo tanto, utilizar como un marco o LinearLayout como contenedor para que fragmentan y se inflan en la devolución de llamada onCreateView a partir del fragmento. Tal vez sea útil, házmelo saber.

¡Salud!

0

Por lo que puedo ver, no estás escondiendo/separando el fragmento anterior para que ambos se muestren.Se puede implementar algo como esto:

 if (mFragment != null) { 
      ft = mActivity.getSupportFragmentManager().beginTransaction(); 
      ft.hide(mFragment);     
      ft.detach(mFragment); 
      ft.commitAllowingStateLoss(); 
     } 
3

No mezclar fragmentos creados en XML y en el Código - ocurrirán cosas malas. Mantenga una vista de contenedor en el diseño, luego agregue/reemplace fragmentos (no tiene el primer fragmento dentro).

Cuestiones relacionadas