2 votes

Modifier la présentation d'Android avec Fragments

Je développe une activité Android qui comporte deux fragments. L'activité a deux présentations possibles L'un d'entre eux est en Portait, l'autre en Paysage.

J'ai créé les fragments qui fonctionnent bien, mais j'ai des problèmes lorsque je change l'orientation du téléphone/de la tablette.

L'un de ces fragments est un Liste des fragments avec une AsyncTask pour charger les données de la liste depuis le web. Je n'ai pas de problème avec ce fragment, car je peux le recréer. (Bien que le chargement prenne un certain temps).

L'autre Fragment contient un fragment de Google Map V2 :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/mapInicio"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />

</LinearLayout>

Je crée les fragments à partir des onCreate de la méthode FragmentActivity :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_inicio);

    Fragment listFragment = new ListaEstaciones();
    FragmentTransaction transList = getSupportFragmentManager()
            .beginTransaction();
    transList.add(R.id.listaestaciones_f_container, listFragment);
    transList.commit();

    Fragment mapFragment = new MapaGoogleV2();
    FragmentTransaction transMap = getSupportFragmentManager()
            .beginTransaction();
    transMap.add(R.id.mapa_f_container, mapFragment);
    transMap.commit();

}

Dans le cadre de la onConfigurationChanged j'ai ce code. Comme dans onCreate Je crée les fragments et je change la vue, car nous sommes maintenant en mode Paysage/Portrait :

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    setContentView(R.layout.activity_inicio);

    Fragment listFragment = new ListaEstaciones();
    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();
    transaction.add(R.id.listaestaciones_f_container, listFragment);
    transaction.commit();

    Fragment mapFragment = new MapaGoogleV2();
    FragmentTransaction transMap = getSupportFragmentManager()
            .beginTransaction();
    transMap.add(R.id.mapa_f_container, mapFragment);
    transMap.commit();

}

Lorsque je crée avec cette méthode, le ListFragment fonctionne parfaitement, mais il ne fonctionne pas avec le MapFragment. L'application chrash dans le onCreateView de la méthode Fragment avec carte . Je pense que je ne peux pas gonfler à nouveau ce fragment :

04-16 18:20:32.795 : E/AndroidRuntime(15543) : Android.view.InflateException : Fichier XML binaire ligne #6 : Erreur de gonflage du fragment de classe

Mes questions :

Existe-t-il un moyen d'éviter la recréation des fragments lors de la modification de la mise en page ?

Comment faire ?

Gracias.

2voto

palvarez89 Points 374

Il n'y a aucun moyen d'éviter la destruction de l'activité si vous n'utilisez pas l'option onConfigurationChanged mais cette solution est parfois difficile à mettre en œuvre.

Après avoir fait des recherches sur le net, j'ai trouvé un article très intéressant qui parle de la façon de gérer manuellement la recréation des fragments, mais cette solution ne fonctionne pas pour mon Map Fragment.

Ma solution finale est de laisser Android changer la mise en page automatiquement, en supprimant android:configChanges=”orientation” du manifeste.

De plus, je ne peux pas utiliser le fragment de carte qui contient la carte Google V2. J'ai utilisé directement le fragment Google Map V2.

Pour conserver l'instance du Fragment, il suffit de mettre l'instruction setRetainInstance(true) :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_inicio);

    Fragment listFragment = new ListaEstaciones();
    listFragment.setRetainInstance(true);
    FragmentTransaction transList = getSupportFragmentManager()
        .beginTransaction();
    transList.add(R.id.listaestaciones_f_container, listFragment);
    transList.commit();
}

Merci pour votre aide.

0voto

TJ Thind Points 764

Si tout ce dont vous avez besoin, c'est d'une mise en page différente pour le portrait et le paysage, il existe un moyen plus simple d'y parvenir. Créez un dossier layout-land et mettez-y les XML de mise en page pour tous les fragments/activités pour lesquels vous voulez spécifier une mise en page différente en paysage. Android s'occupera de la mise en page à utiliser en fonction de l'orientation. Consultez cette page sur developer.Android.com pour plus d'informations.

Voici un autre exemple de ce que je veux dire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X