2012-02-20 25 views
6

Esta aplicación es un ejercicio de aprendizaje para mí que utiliza fragmentos, entre otras cosas. Tiene una sola actividad que gestiona algunos fragmentos diferentes. El primero es un ListFragment (A), que muestra cuándo se inicia la aplicación y carga elementos de la lista desde un cursor. Al hacer clic en un elemento de la lista se notifica a la actividad para reemplazar el ListFragment con un DetailFragment (B) para ese elemento. Si mientras mira a (B) puedo rotar la pantalla, veo (B) en la parte superior de (A), así:Fragmentos de Android que se superponen después de la rotación de la pantalla

http://postimage.org/image/uhy016ds7/

Mi mejor conjetura es que tiene que ver con la destrucción y volver a Android creando la actividad en un cambio de configuración. Me pregunto cuál es la solución más limpia para este problema. Siguen algunos fragmentos de código, avíseme si hay algo más que deba publicar.

res/layout/home.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_container" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <fragment 
     android:id="@+id/fragment_place_list" 
     android:name="com.simbiosys.apps.foodfast.ui.PlaceListFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </fragment> 
</FrameLayout> 

MyActivity.onCreate

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 

    placeListFragment = (PlaceListFragment) getSupportFragmentManager().findFragmentById(
      R.id.fragment_place_list); 

} 

MyActivity.showDetailPane

public void showDetailPane(String id, String reference) { 
    placeDetailFragment = PlaceDetailFragment.newInstance(id, reference); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 
    ft.addToBackStack(null); 
    ft.hide(placeListFragment); 
    ft.replace(R.id.fragment_container, placeDetailFragment); 
    ft.show(placeDetailFragment); 
    ft.commit(); 
} 
+0

¿Has mirado en 'recursos alternativos'? http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources –

+0

Bueno, me estoy enfocando en las pantallas de los teléfonos en este momento.El diseño de ListFragment no sería diferente en el paisaje de todos modos. De hecho, no hay un diseño xml para ListFragment ya que todo lo que tiene actualmente es el ListView incorporado. – Karakuri

Respuesta

4

Es porque usa un diseño de marco como contenedor. No se superpondrá para otros diseños.

Y para lo que desea lograr la mejor práctica es hacer un archivo XML en su diseño/carpeta donde solo se utiliza su fragmento de lista. En su layout-land/pone un archivo XML con ambos fragmentos usados ​​y organizados.

Luego el sistema maneja toda la creación del. fragmentos Y su actividad básicamente se reduce a una llamada setContentView().

En un elemento de la lista, haga clic en él y luego verifique con el administrador de fragmentos si su fragmento de detalle se ha creado o no. Si se crea, su llamada es una función pública dentro del fragmento de detalle para establecer los datos.

Si no se crea, crea un intento con una nueva actividad.

Sé 2 buenos tutoriales: la página de fragmentos en la página de desarrolladores de android y vogella.de ambos le darán un ejemplo detallado/tutorial.

+0

Gracias por señalar que fue el FrameLayout. Sin embargo, estoy tratando de no comenzar otra actividad ya que este está haciendo otro trabajo detrás de escena. Dicho esto, me has dado una o dos ideas para solucionar, así que gracias. – Karakuri

2

Esto funciona para mí.

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    .... 
    fragment = getFragmentManager().findFragmentByTag(TAG); 
    if(fragment == null) fragment = new Fragment(); 
    .... 

} 
3

Cambie FrameLayout for LinerLayout y el problema estará resuelto.

Este es un problema relacionado con FrameLayout.

+1

Esto funcionó para mí sin tener que cambiar mi arquitectura. – BeccaP

5

Según el desarrollo de Android page, en el método onCreate de Activity debe comprobar si el estado de instancia salvado es nulo antes de agregar el fragmento a la actividad. El fragmento de código del método de actividad onCreate del this page indica que.

// However, if we're being restored from a previous state, 
// then we don't need to do anything and should return or else 
// we could end up with overlapping fragments. 
if (savedInstanceState != null) { 
    return; 
} 
+0

Gracias, funciona perfectamente, me salvó después de 2 horas de luchar con él – Mal

+0

simple y esto funcionó. – iCrus

Cuestiones relacionadas