Pregunta

Esta aplicación es un ejercicio de aprendizaje para mí usando fragmentos, entre otras cosas. Tiene una sola actividad que administra algunos fragmentos diferentes. El primero es un ListFragment (A), que muestra cuándo la aplicación comienza y carga los elementos de la lista desde un cursor. Al hacer clic en un elemento de lista, notifica la actividad para reemplazar el listfragment con un fragmento de detalle (b) para ese elemento. Si mientras mira (b) giro la pantalla, veo (b) encima de (a), así:

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

Mi mejor suposición es que tiene que ver con la destrucción de Android y la recreación de 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 debería publicar.

res/diseño/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.encreate

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();
}
¿Fue útil?

Solución

Es porque usa un diseño de cuadro como contenedor. No se superponer para otros diseños.

Y para lo que desea lograr las mejores prácticas es hacer un archivo XML en su diseño/ carpeta donde solo se utiliza su ListFragment. En su diseño de diseño/ Usted pone un archivo XML con ambos fragmentos utilizados y dispuestos.

Entonces 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 Revise con el Administrador de fragmentos si se crea o no su fragmento de detalle. Si se crea, su llamada, una función pública dentro del fragmento de detalle para establecer los datos.

Si no se crea, crea una intención con una nueva actividad.

Conozco 2 buenos tutoriales: la página de fragmentos en la página de Android Developers y Vogella.de le dará un ejemplo/tutorial detallado.

Otros consejos

Según Android Dev página, en el método de OnCreate de Activity, debe verificar si el SavedInstancate es nulo antes de agregar el fragmento a la actividad. Fragmento de código del método de actividad de OnCreate de esta página Establece 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;
}

Cambie el framelayout para LinerLayout y el problema se resolverá.

Este es un problema relacionado con Framelayout.

Esto funciona para mí.

public void onCreate(Bundle savedInstanceState) {

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

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top