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 :

Comment faire choisir mon application entre le mode paysage et le mode portrait ?


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Comment faire choisir mon application entre le mode paysage et le mode portrait ?
    bonjour à tous.

    Je débute en prog android, et je cherche le moyen de faire tester la taille du terminal utilisé, afin de savoir si elle doit afficher en portrait ou paysage.
    Je m'explique, le CDG est le suivant : si c est une tablette, alors on passe en mode paysage, si c'est un smartphone, elle passe en mode portrait. Ceci n'est pas réciproque.
    Alors après avoir passé la journée à chercher, j'ai bien quelques pistes, j'ai vu que je pouvais créer un layout destiné spécialement au landscape si je le désire afin d 'affiner mon interface dans ce mode.
    J'ai également vu une façon de procéder qui met en place la création d'une classe spéciale qui décide si l'orientation est en paysage ou portrait, avec un peu de code a ajouté dans ma Main classe pour le test d'orientation du terminal.
    Mais moi je ne veux pas cela. J'aimerais un moyen de tester si la résolution de mon écran est au dessus de 6 pouces ( ce qui du coup en fait une tablette) ou en dessous ce qui en fait un smartphone (ouais je sais je suis trop fort ^^).
    Je pense devoir placer cela dans le " onCreate" dans mon activité principale, je chauffe ?
    je me mélange un peu les pinceaux, mais je suis un grand débutant, je comprends ce que je lis mais ne parviens pas encore à "créer" ce genre de choses, du coup la structure même de la méthode à appliquer me reste obscure .
    Une âme charitable pour m'éclairer ?
    svp, ne m'envoyez pas sur d'autres sujets traitant " à peu près " ma question, j'y ai passer 8h, j'en suis revenu brocouille :/
    j'ai visité plusieurs site, ils traitent tous de l'orientation mais sans jamais définir un état en "dur" selon la taille de la machine ou doit s'exécuter l'appli.
    Merci beaucoup par avance, des coups de mains, indices et idées.
    Daekyn, apprenti sorcier.

  2. #2
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Code java : 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
     
    public class A1 extends Activity {
     
     
        //Méthode pour tester la surface d'affichage
        public boolean isTablet(Context context) {
             return (context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK)
                >= Configuration.SCREENLAYOUT_SIZE_LARGE;
         }
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (isTablet(this)) { 
                 setContentView(R.layout.un_joli_layout_pour_tablette);
            } else {
                 setContentView(R.layout.un_joli_layout_pour_smartphone);
            }
        }
     
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci d'avoir répondu si vite !
    Quand je vois la simplicité de votre code, je me dit que j'ai encore bien du chemin à faire pour arriver à créer ce genre de chose naturellement ^^.
    L'utilisation du booléen était pourtant logique, il y avait deux états, tablette/tel.
    juste une petite confirmation :
    (Bundle savedInstanceState) , ceci enregistre l'état de l activité avant la faire passer d un mode d'affichage à l'autre car, pour passer à un autre mode d'affichage, android détruit la vue précédente c'est bien ça ?
    je ne peux malheureusement pas tester cela tout de suite, je vous assure un retour trés rapide sur les difficultés que j'aurai pu ( ou pas) rencontrer !
    Encore merci.
    Daekyn

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Pour la gestion de l'orientation ainsi que tablet/téléphone android propose tout ce qu'il faut.

    1- Les dossiers de ressources.

    Au maximum tu dois utiliser les dossiers de ressources et éviter les conditions dans le code pour une évidente raison de clareté du code.
    Par défaut :
    /res/layout => va correspondre à un téléphone ou une tablette en portrait
    /res/layout-land => va correspondre au interface téléphone en paysage
    /res/layout-sw600dp-land => tablette 7"en paysage
    /res/layout-sw720dp-land => tablette 10" en paysage

    Tu peux aussi définir des dossiers spécifiques pour tablette en portrait , bref tout est possible. Voir la doc pour toutes les possibilités :
    http://developer.android.com/guide/p...s_support.html

    2- Dans le code

    Malgré tout , il arrive que l'on est besoin dans le code de différencier tablette et téléphone par exemple.
    Pour celà la solution la plus simple est encore d'utiliser les dossier de ressources.

    Par exemple dans :
    res/values/config.xml tu déclares :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <resources>
        <bool name="isTablet">false</bool>
    <resources>
    et dans res/values-sw600dp/config.xml tu déclares :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <resources>
        <bool name="isTablet">true</bool>
    <resources>
    Ne te reste alors plus qu'à définir une constante basée sur cette valeur. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MyApp extends Application
    {
    	public static boolean IS_TABLET = false;
     
    	public void onCreate() {
    		MyApp.IS_TABLET = getResources().getBoolean(R.bool.isTablet);
    	}
    }
    N'importe ou dans ton code , tu peux ensuite tester si tu es sur un téléphone ou une tablette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(MyApp.IS_TABLET) {
        //Tablette
    } else {
       //T2léphone
    }
    Tu peux évidemment utiliser la même astuce pour savoir si tu es dans un layout en portrait ou en paysage.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut ca ne fonctionne pas dans un des deux cas .
    je reviens vers vous car j ai essayer vos solutions mais :

    -"il" ne passe pas dans la boucle qui deterlmine si ce st une tablette ou un tel
    -res/values/config.xml et res/values-sw600dp/config.xml , n'apparaissent pas, meme si je créer les deux layout correspondant.
    - je ne dois pas bloquer l'orientation dans le manifeste car cela bloque l appli en landscape a la fois en tel ET en tablette.
    -j'ai testé le booléen, la modif du manifest, j'ai même réussi a créer un toaster qui affiche la vraie résolution du terminal affiché dans l émulateur histoire d être sur que je n'ai pas de bug de ce coté.
    -j'ai testé de modifier directement les fichiers layouts (xlarge et normal) en insérant mon " activity " et en lui lui passant android: screenOrientation= " landscape" ( la mm avec le layout normal et portrait), mais évidement il m'envoie péter.

    Donc je reprends, je dois faire en sorte qu a la détection d une tablette ça verrouille en landscape, et si ça détecte un tel, ça verrouille en portrait, je ne dois pas choisr entre l'un et l'autre.
    Ha et petit plus qui fait plaisir, cette appli doit tourner au minimum sur honeycomb, ce qui veut dire que avant 3.2 le layout doit s appeler xlarge et après 3.2 il s appellera sw600dp.

    je vous met des captures d écran des différents éléments auxquels je fais référence. ainsi vous verrez que je ne me contente pas de demander, j'en chie sérieux pour une ridicule fonction, le coté positif c'est que du coup j'apprends très
    vite a force de recommencer ^^
    Nom : layouts.PNG
Affichages : 2221
Taille : 9,1 KoNom : layout sw660dp.PNG
Affichages : 2232
Taille : 48,3 KoNom : manifest.PNG
Affichages : 2252
Taille : 27,3 KoNom : on create.PNG
Affichages : 2278
Taille : 58,5 Ko

    voila je sais c est un peu le cirque , si l'un d'entre vous se sent chaud pour un partage d'écran via skype pour me faire un tuto en direct, j'en serai ravi, envoyez moi un petit message en privé ^^
    merci beaucoup d'avance

    Daekyn, l'apprenti sorcier, qui en chie mais ne lâchera rien

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut précision
    alors cela fonctionne pour les téléphones, l appli se charge bien en mode portrait en ne bouge pas, c'est pour les tablettes que ca ne marche pas, il considère toujours que ce n 'est pas une tablette, je suis obligé de placer un " return (true)" sur le booléen qui est sensé gérer ça, et la oui il passe en mode tablette ( landscape) , mais du coup c'est le mode téléphone qui disparaît ^^
    je vous met un screen de cette partie qui détecte la résolution et du coup devrait décider si c est une tablette ou un telephone
    Nom : booléen.PNG
Affichages : 2194
Taille : 24,9 Ko

    Re merci
    re Daekyn

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je pense que:
    1. Il faut utiliser la méthode de grunk pour savoir si on est sur une tablette ou non.
    2. Dans l'activité utiliser: setRequestedOrientation pour forcer une orientation spécifique, et demander dans le manifeste à gérer les changement d'orientation du téléphone soit-même (mais en ne faisant rien).

    Autre possibilité... utiliser les alias de layout:
    http://developer.android.com/trainin...seAliasFilters

    Et voir dans le layout lequel est selectionné et choisir la bonne orientation ad-hoc...

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut c'est bon, ca fonctionne , du coup je vous apporte une explication.
    Voila, ça fonctionne, et en fait ça fonctionnait depuis quasiment le début, alors pourquoi tant de complications pour simplement afficher du portrait en tel et du paysage en tablette, le tout en mode verrouiller ?
    Et bien tout simplement à cause du nombre immense de résolutions différentes, du fait que certains téléphones, (comme mon note 3 par exemple), ont une résolution si haute, qu'ils sont considérés comme des tablettes par android, et inversement les premières tablettes ont des résolutions si faibles qu'elles seront toujours vues comme des téléphones ...
    Moi je testais sur un émulateur nexus 10, la première version de la tablette et elle est toujours vue comme un tel(800*1280) ! Alors que dès que je suis passé sur un émulateur nexus 9 ( 1536*2048), et bien directement mon appli se lançait bien en mode tablette comme je le désirais. Puis pour confirmer mon test, j'ai lancé émulateur du nexus 5 (1920*1080) et lui est pris comme un vrai téléphone avec mon appli qui fonctionne bien .

    Du coup j'en viens à ma conclusion, c'était ( je pense ) peine perdue de tenter de rendre cette appli compatible avec absolument tous les terminaux, la faute a trop de mix de résolutions entre les milliers de terminaux différents tournant sous android, tablettes et téléphones confondus ?
    Voilà j'attends simplement la confirmation de ma conclusion par les membres m'ayant aidés sur ce problème afin de passer ma questions en résolue, et pouvoir aider à mon tour.
    Daekyn, l'apprenti sorcier, un peu moins apprenti.

  9. #9
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ce n'est pas "peine perdue", mais c'est assez complexe de prendre en compte "toutes les tablettes" à cause de la période de transition d'Android smartphone/tablette. Les premières tablettes sont assez complexes à différencier, du fait de la résolution, mais sont aussi complexes à prendre en compte du fait de leur puissance très limitée comparées aux autres (oui Galaxy Tab première du nom, je pense à toi).

    Il y a encore trop de cas différents pour tout prendre en compte. Ca a tendance à se lisser avec le temps, mais il reste encore pas mal de "folies" de constructeurs...

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Heu... même la Nexus 10" première du nom avait bien un screen-size xlarge si mes souvenirs sont bon non ?... (720dp de hauteur en mode paysage)
    Et la résolution n'a pas grand chose à faire là dedans. Tant que tout est bien fait en "dp", peut-importe la résolutation du terminal.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    @ nicroman

    Alors du coup je ne comprends absolument pas pourquoi mon appli se lance en mode téléphone sur la nexus 10, alors que sur la nexus 9 tout se passe bien , elle fonctionne directement en tablette( en tout ça, quand je lance l'émulateur).
    Un mystère de la création ?

    Daekyn

  12. #12
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ne connaissant pas ton code de selection final, difficile à dire...

    Mais si la logique est basée sur les dp (xlarge pour android < 3.0, et sw600dp pour android >= 3.0) il ne devrait pas y avoir de soucis....

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/02/2013, 13h29
  2. Réponses: 5
    Dernier message: 07/05/2007, 10h44
  3. Comment faire un retour ligne entre des " ??
    Par DrTank dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 09/05/2005, 09h35
  4. Réponses: 10
    Dernier message: 30/06/2004, 13h00
  5. Réponses: 6
    Dernier message: 14/05/2004, 11h18

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