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

Composants graphiques Android Discussion :

Position des custom View dans un LinearLayout


Sujet :

Composants graphiques Android

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Points : 102
    Points
    102
    Par défaut Position des custom View dans un LinearLayout
    Bonjour à tous,

    J'ai développé deux custom View que j'aimerais positionner l'un à côté de l'autre dans mon layout. J'utilise donc LinearLayout (potentiellement avec layout_weight) en me disant que mes View seront automatiquement positionné l'un à côté de l'autre.
    Seulement, je ne parviens pas à arriver à mes fins. Ma seconde View se superpose sur la première View et ont l'air d'avoir le même origine.

    J'ai testé le LinearLayout avec des simple TextView et je n'ai aucun problème à diviser mon écran en 4 par exemple, chaque TextLayout se positionne naturellement les uns à côté des autres.

    Voici mon 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
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/plank"
        android:orientation="horizontal"
        tools:context="${relativePackage}.${activityClass}" >
     
        <fr.test.drawing.WorldMapView
        android:id="@+id/worldmap"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" 
        android:layout_weight="3"/>
     
        <fr.test.drawing.ZoneInformationView
            android:id="@+id/zoneinfo"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" 
            android:layout_weight="2"/>
     
    </LinearLayout>
    Mes 2 View surcharge les méthode onDraw() et onMeasure(). Les width et height à la sortie de onMeasure() sont bien ceux attendus. Chaque View contient une simple Bitmap taillé selon width et height (renvoyés par onMeasure). Et mes deux images se superposent...

    Etant en "wrap_content" dans les deux cas en width, comment est définie la taille du contenu à l'intérieur de mes View ?
    Qu'est-ce-que je rate ?

    Merci pour vos réponses. Je peux apporter plus d'infos si besoin!

  2. #2
    Membre actif Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Points : 245
    Points
    245
    Par défaut
    Bonjour,

    Le positionnement de widget dans les layout a toujours été une horreur pour moi aussi ^^
    J'ai aussi eu pas mal de soucis avec le système de poids qui me fait des rendus parfois bizard...

    En règle générale, si tu veux un affichage facile a mettre en place et efficace, utilise le relativeLayout. Tu peux dire explicitement dire que tu souhaite que ton widget se trouve a droite d'un autre widget et tu n'a plus de probleme de superposition ou de mauvais alignement...

    PS: Je suis pas contre une explication clair de comment fonctionne les poids des vue sur l'interface

    GLHF

  3. #3
    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
    Normalement, le "weight" permet d'assigner une taille en fonction de la taille disponible une fois que les autres views ont été placées / mesurées.

    Par exemple, un layout horizontal de 300dp.
    Une ImageView A de 80dp (wrap_content)
    Un TextView B avec un weight de 1
    Un TextView C avec une taille de 100dp (wrap_content)
    Un TextView D avec un weight de 2.

    On aura comme résultat:
    A et C sont récupérés directement => 80dp et 100dp respectivement... reste donc 120dp dans le layout
    B et D sont calculés en fonction du weight => 40dp pour B, et 80dp pour D.

    Le Layout aura donc:
    A: 80dp
    B: 40dp
    C: 100dp
    D: 80dp


    Dans l'exemple ci-dessus, ZoneInformationView occupera donc 40% de l'espace disponible, et WorldMapView 60%...
    Donc sans même utiliser (à priori) la valeur retournée par le "onMeasure".



    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Membre actif Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Points : 245
    Points
    245
    Par défaut
    Re,

    Donc a priori, la taille du widget est égal a : son poid / la somme de tout les poids

    Le truc bizarre, c'est que quelque fois, cela me donne un comportement totalement inverse : plus c'est petit et plus ca prend de place 0o
    J'ai pas d'exemple precis a donner mais je penserais a poster la prochaine fois que cela m'arrive ^^

  5. #5
    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
    Ben en fait cela dépend aussi du "android:weightSum" du parent. Si pas renseigné, il est calculé automatiquement.

    En plus... si un "child" a un layout_width qui n'est pas à 0dp il est compté dans l'espace occupé....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Points : 102
    Points
    102
    Par défaut
    Bonsoir Altak, bonsoir nicroman,

    J'ai suivi votre échange et mis à part quelques précisions, c'est ce que j'avais compris concernant le poids des différents composants.
    Mais cela ne résout pas mon problème...

    Dans l'exemple ci-dessus, ZoneInformationView occupera donc 40% de l'espace disponible, et WorldMapView 60%...
    Donc sans même utiliser (à priori) la valeur retournée par le "onMeasure".
    C'est bien ça le problème, je m'attendais à ce comportement et malheureusement mes deux View se superposent au lieu de suivre le 40/60 (que je surcharge ou pas onMeasure d'ailleurs...).

    A quoi peut être du ce comportement ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    Bonjour,
    As-tu essayé de mettre android:layout_width à zéro dans tes custom views ?
    Lorsque j'utilise weight, je mets toujours width ou height à zéro.

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Points : 102
    Points
    102
    Par défaut
    Bonjour ecplusplus,

    Il me semble que j'ai déjà essayé. J'ai bricolé un peu dans tout les sens pour arriver à mes fins alors il est possible que autre chose n'allait pas à ce moment là.
    Je ferai le test en rentrant du taf ce soir.

    Je me demandais également si je ne devais pas fournir la propriété layout_gravity sur mes View ? De même, je tenterai ce soir.

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Points : 102
    Points
    102
    Par défaut
    Bon j'ai trouvé mon erreur... Terriblement gênant pour moi, j'ai honte!

    En fait, voici la méthode onDraw() que j'utilisais dans mes deux View :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
    protected void onDraw(Canvas canvas) {
     
    	this.setX(marginLeft);
    	this.setY(marginTop);
    	super.onDraw(canvas);
     
            zoneInfoBG = BitmapUtils.getResizedBitmap(zoneInfoBG, viewWidthPx - marginLef t- marginRight, viewHeightPx - marginTop - marginBottom);
            canvas.drawBitmap(zoneInfoBG, 0, 0, p);
    }
    A la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    protected void onDraw(Canvas canvas) {
     
    	super.onDraw(canvas);
     
            zoneInfoBG = BitmapUtils.getResizedBitmap(zoneInfoBG, viewWidthPx - marginLef t- marginRight, viewHeightPx - marginTop - marginBottom);
            canvas.drawBitmap(zoneInfoBG, marginLeft, marginTop, p);
    }
    Je forçais en fait le point d'origine dans mon Layout...
    Bon, pour ma defense, je pensais que setX() et setY() placeraient la View selon la position qu'elle devrait occuper avec le comportement normal de LinearLayout. Je ne m'y ferai pas prender 2 fois!

    Désolé pour le dérangement!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/12/2010, 14h47
  2. Détection position des yeux dans une image
    Par Morvan Mikael dans le forum Traitement d'images
    Réponses: 16
    Dernier message: 24/12/2008, 23h09
  3. Réponses: 3
    Dernier message: 29/05/2008, 11h59
  4. Position des lignes dans l'environnement align
    Par rahimk dans le forum Mathématiques - Sciences
    Réponses: 7
    Dernier message: 03/01/2007, 16h02
  5. [TP] La position des entiers dans un tableau
    Par argon dans le forum Turbo Pascal
    Réponses: 22
    Dernier message: 21/12/2006, 11h42

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