Question

Cette application est pour moi un exercice d'apprentissage utilisant des fragments, entre autres. Il a une seule activité qui gère différents fragments. Le premier est un ListFragment (A), qui montre quand l'application démarre et charge les éléments de la liste à partir d'un curseur. Cliquer sur un élément de liste notifie l'activité pour remplacer le ListFragment par un DetailFragment (B) pour cet élément. Si en regardant (B) je fais pivoter l'écran, je vois (B) au-dessus de (A), comme ceci:

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

Ma meilleure estimation est que cela a à voir avec la destruction et la recréation d'Android de l'activité lors d'un changement de configuration. Je me demande quelle est la solution la plus propre à ce problème. Quelques extraits de code suivent, faites-moi savoir s'il y a autre chose que je devrais publier.

< 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();
}

Était-ce utile?

La solution

C'est parce que vous utilisez une disposition de cadre comme conteneur. Cela ne se chevaucherait pas pour d'autres mises en page.

Et pour ce que vous voulez obtenir, la meilleure pratique est de créer un fichier XML dans votre mise en page / dossier où seul votre fragment de liste est utilisé. Dans votre layout-land / vous mettez un fichier XML avec les deux fragments utilisés et arrangés.

Ensuite, le système gère toute la création du fichier.fragments.Et votre activité se réduit essentiellement à un appel setContentView ().

Sur un élément de liste, cliquez sur vous puis vérifiez auprès du gestionnaire de fragments si votre fragment de détail est créé ou non.S'il est créé, vous appelez une fonction publique dans le fragment de détail pour définir les données.

S'il n'est pas créé, vous créez un intent avec une nouvelle activité.

Je connais 2 bons tutoriels: la page des fragments sur la page des développeurs Android et vogella.de vous donneront tous deux un exemple / tutoriel détaillé.

Autres conseils

Selon la page du développement Android, dans la méthode onCreate d'Activityvous devez vérifier si le savedInstanceState est nul avant d'ajouter le fragment à l'activité.L'extrait de code de la méthode d'activité onCreate de cette page indique 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;
}

Modifiez le FrameLayout pour LinearLayout et le problème sera résolu.

Il s'agit d'un problème lié à FrameLayout.

Cela fonctionne pour moi.

public void onCreate(Bundle savedInstanceState) {

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top