IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Changement orientation : sauvegarde de l'écran en cours d'affichage


Sujet :

Android

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Changement orientation : sauvegarde de l'écran en cours d'affichage
    Bonjour à tous,

    Dans mon fichier XML main.xml j'ai :
    - une image qui s'affiche sur la totalité de mon écran (fond d'écran)
    - puis une partie supérieure de l'IHM plusieurs ImageView et Button.
    - et enfin une partie inférieure de l'IHM qui affiche soit :
    + android.support.v4.view.ViewPager (composé de deux fragments)
    + un autre écran (fenetre_erase.xml composé de plusieurs Button)

    J'ai un répertoire /layout pour l'affichage en mode paysage où j'ai placé les fichiers (main.xml, layout_fragment1.xml, layout_fragment2.xml et fenetre_erase.xml) ainsi qu'un répertoire /drawable où sont placées mes images dimensionnées pour le mode paysage
    J'ai un répertoire /layout-port pour l'affichage en mode portrait où j'ai placé les mêmes fichiers (main.xml, layout_fragment1.xml, layout_fragment2.xml et fenetre_erase.xml), j'ai juste modifié la position de chaque composant dans ces fichiers XML et un répertoire /drawable-port où sont placées les mêmes images que dans /drawable mais avec des dimensions adaptées pour le mode paysage.

    main.xml mode paysage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#ff0000">
        <ImageView
    		android:id="@+id/IdImgFondEcran"
    		android:src="@drawable/fond_ecran"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:layout_gravity="center"
    		/>
    	<Button
    		android:id="@+id/IdButonErase"
    		android:background="@drawable/button_erase"
    		android:onClick="fonctionErase"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:layout_marginTop="25px"
    		android:layout_marginLeft="4px"
    		/>
    	<ImageView
    		android:id="@+id/IdIconBatteryLevel"
    		android:src="@drawable/icon_battery"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:layout_marginTop="34px"
    		android:layout_marginLeft="1179px"
    		/>
             <FrameLayout android:id="@+id/IdLayoutMain" 
        	        android:layout_width="wrap_content"
        	        android:layout_height="wrap_content"
        	        android:layout_marginTop="250px">
      			<android.support.v4.view.ViewPager
      			android:id="@+android:id/viewpager"
      			android:layout_width="wrap_content"
     			android:layout_height="wrap_content"
      			/>
      	</FrameLayout>
            <FrameLayout android:id="@+id/IdLayoutErase" 
        	        android:layout_width="wrap_content"
        	        android:layout_height="wrap_content"
        	        android:layout_marginTop="250px">
        	        <include android:id="@+id/erase" layout="@layout/fenetre_erase"/>
      	</FrameLayout>
    </FrameLayout>
    J'ai également une classe PagerAdapter dérivant de FragmentPagerAdapter et enfin la classe ViewPagerFragmentActivity dérivant de FragmentActivity.

    Au démarrage de l'application, j'affiche dans la partie inférieure le premier fragment (layout_fragment1.xml du répertoire /layout) en mode paysage. Quand je passe en mode portrait, j'affiche le fragment adapté au mode portrait (layout_fragment1.xml du répertoire /layout-port).

    Jusqu'ici tout va bien...
    Jusqu'ici tout va bien...

    Mais lorsque je suis sur le fragment2 (layout_fragment2.xml) ou sur l'écran fenetre_erase.xml en mode paysage et que je passe en mode portrait (ou au passage du mode portrait au mode paysage), l'application affiche le fragment1 (layout_fragment1.xml).

    Je voudrais afficher la page courante lors d'un changement d'orientation de ma tablette. C'est à dire, quand je suis sur le fragment2 layout_fragment2.xml en mode paysage et que je change d'orientation, mode portrait, je voudrais afficher le fragment2 (layout_fragment2.xml adapté au mode portrait) et non pas afficher le fragment1 (layout_fragment1.xml).

    Avez vous des solutions ? des conseils ?

  2. #2
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    A toi de sauvegarder l'état de ton application avant la sauvegarde et de la remettre à jour lors de la rotation.

    Pour cela tu peux utiliser onRestoreInstanceState et onSaveInstanceState:
    http://developer.android.com/referen...oid.os.Bundle)


    Sinon autre possibilité tu peux intercepter la rotation avec onConfigurationChanged et en précisant dans le manifest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    android:configChanges="orientation"
    http://developer.android.com/referen...Configuration)

    Tu peu aussi voir les tutoriels et cours de formation pour apprendre la programmation Android : http://android.developpez.com/cours/

    à toi à partir de cette redéfinition de mettre à jour ton interface ^^ si cela s'avère nécessaire.

    La seconde option empêchera l'application de repasser dans le OnCreate !
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Merci pour ton aide Feanorin,

    J'ai utilisé onRestoreInstanceState et onSaveInstanceState.

    J'ai implémenté ces deux méthodes dans ma classe ViewPagerFragmentActivity dérivant de FragmentActivity.
    Cela marche bien quand j'affiche la fenetre_erase.xml.
    Mais lorsque j'affiche le deuxième fragment (layout_fragment2.xml) du ViewPager, lors du changement de rotation je reviens sur le premier fragment !!!

    voici le code de ViewPagerFragmentActivity.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    public class ViewPagerFragmentActivity extends FragmentActivity{
     
    	private static FrameLayout Layout1 ;
            private static FrameLayout Layout2 ;
     
            private static ViewPager pager;
            private PagerAdapter mPagerAdapter;
     
            @Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		super.setContentView(R.layout.main);
     
                    Layout1 = (FrameLayout)findViewById(R.id.IdLayoutMain);
                    Layout2 = (FrameLayout)findViewById(R.id.IdLayoutErase);
     
                    Layout1.setVisibility(View.VISIBLE);
                    Layout2.setVisibility(View.GONE);
     
                    //initialise the pager
    		this.initialisePaging();
    }
     
             private void initialisePaging() {
     
    		List<Fragment> fragments = new Vector<Fragment>();
    		fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
    		fragments.add(Fragment.instantiate(this, Fragment2.class.getName()));
    		this.mPagerAdapter  = new PagerAdapter(super.getSupportFragmentManager(), fragments);
    		//
    		pager = (ViewPager)super.findViewById(R.id.viewpager);
    		pager.setAdapter(this.mPagerAdapter);
    	}
     
            @Override
    	public void onSaveInstanceState(Bundle outState)
    	{
    		outState.putInt("lay1_int", Layout1.getVisibility());
    		outState.putInt("lay2_int", Layout2.getVisibility());
    }
            @Override
    	public void onRestoreInstanceState(Bundle savedInstanceState)
    	{
    		if(savedInstanceState.getInt("lay1_int") == 0)
    		{
                         Layout1.setVisibility(View.VISIBLE);
    		     Layout2.setVisibility(View.GONE);
                    }
                    else
                    {
                         Layout1.setVisibility(View.GONE);
    		     Layout2.setVisibility(View.VISIBLE);
                    }
    }
    }
    fichier main.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#ff0000">
        <ImageView
    		android:id="@+id/IdImgFondEcran"
    		android:src="@drawable/fond_ecran"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:layout_gravity="center"
    		/>
    	<Button
    		android:id="@+id/IdButonErase"
    		android:background="@drawable/button_erase"
    		android:onClick="fonctionErase"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:layout_marginTop="25px"
    		android:layout_marginLeft="4px"
    		/>
    	<ImageView
    		android:id="@+id/IdIconBatteryLevel"
    		android:src="@drawable/icon_battery"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:layout_marginTop="34px"
    		android:layout_marginLeft="1179px"
    		/>
             <FrameLayout android:id="@+id/IdLayoutMain" 
        	        android:layout_width="wrap_content"
        	        android:layout_height="wrap_content"
        	        android:layout_marginTop="250px">
      			<android.support.v4.view.ViewPager
      			android:id="@+android:id/viewpager"
      			android:layout_width="wrap_content"
     			android:layout_height="wrap_content"
      			/>
      	</FrameLayout>
            <FrameLayout android:id="@+id/IdLayoutErase" 
        	        android:layout_width="wrap_content"
        	        android:layout_height="wrap_content"
        	        android:layout_marginTop="250px">
        	        <include android:id="@+id/erase" layout="@layout/fenetre_erase"/>
      	</FrameLayout>
    </FrameLayout>
    Je ne comprends pas pourquoi quand j'affiche le Layout2 (c'est à dire fenetre_erase.xml) cela marche alors que lors de l'affichage du deuxième fragment cela ne marche pas !!!

    Avez-vous des suggestions ?

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Avez-vous des suggestions ?
    Parce que tu tu ne sauvegardes pas l'état de ton pager pour savoir si la première page ou la seconde est active.
    Tu ne sauvegardes que les états de tes layouts.

    A toi de sauvegarder l'état de ton pager et de l'initialiser .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Merci pour ta solution,

    Je vais me renseigner pour sauvegarder l'état du pager et ensuite je reviendrai sur cette discussion pour indiquer le code et donc résoudre cette discussion...

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour à tous,

    j'ai trouvé une solution à mon problème :

    Dans ma classe ViewPagerFragmentActivity :
    +ajout de la variable private static Parcelable stateViewFragment qui me sert à stocker l'état du pager.

    +dans méthode onSaveInstanceState(Bundle outState) :
    + stateViewFragment = pager.onSaveInstanceState();

    +dans méthode onRestoreInstanceState(Bundle savedInstanceState) :
    + pager.onRestoreInstanceState(stateViewFragment);

    ça marche très bien...

    Merci Feanorin pour ton aide !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. détecter le changement de résolution de l'écran
    Par jdddeschamps dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 17/01/2010, 22h46
  2. Changement orientation texte spreadsheet
    Par lahyo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/11/2009, 14h33
  3. Changement du text d'un label en cours d'execution sous GTK+.
    Par jubaPython dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 10/05/2009, 20h43
  4. Réponses: 1
    Dernier message: 21/11/2008, 10h26
  5. Pas de sauvegarde de l'enregistrement en cours
    Par snoopy69 dans le forum IHM
    Réponses: 10
    Dernier message: 29/11/2005, 08h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo