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 :

Problèmes de positions de boutons avec XML, respect des echelles avec les DPI


Sujet :

Composants graphiques Android

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Association cyberculturelle
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Association cyberculturelle
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Problèmes de positions de boutons avec XML, respect des echelles avec les DPI
    Bonjour à tous.

    Attention, je suis débutant en dev sous Android Apres de nombreuses nuits (et jours) de recherche, tests et expériences, je n'ai pas encore réussi a faire complètement ce que je souhaite...

    J'essaie de faire une palette de peinture tactile pour android et je souhaite faire fonctionner l'application sur un tablet.

    Voici les 2 captures d'ecran de ce que je suis entrain de faire:





    En fait le problème que j'ai c'est que la position du bouton rouge que je defini par 100dp en X et 100dp en Y, j'ai l'impression que c'est en pixels que cela s'affiche et non pas en dp, qui devraient théoriquement s'adapter en fonction de la resolution de l’écran. (Regardez bien la position du point rouge sur les deux résolutions d’écran Android différentes).

    Pour ce qui concerne le background et l'image de la palette, celui-ci s'adapte parfaitement a tout type d'ecran.

    Pour info, le dessin de la palette est un fichier d'image vectoriel SVG, et j'utilise une librairie de visualisation d'image vectoriel afin d'avoir aucun pixel quel que soit la résolution. (svg-android-1.1.jar). - D'ailleurs cette librairie je la trouve fantastique

    Pour la taille des boutons je sais que je doit placer les XML de design des boutons dans les dossiers drawable-hdpi, drawable-mdpi et drawable-ldpi, j'ai testé et cela fonctionne

    Je suis juste bloqué avec les positions des boutons en fonction des differentes resolutions.

    Certes, je pourrai brider mon application a fonctionner juste sur la tablet que je vais utiliser mais le but n'est pas la, le but est d'en faire profiter toute la communauté artisique et de developpement android.

    Ici je vous met le code source de mon 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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/backgnd_main"
    >
     
         <ImageView
            android:id="@+id/bkgndimage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"            
            />
     
            <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
        	android:orientation="horizontal" 
        	>
     
     
            <Button
            android:id="@+id/buttonred"   
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="100dp"
            android:layout_marginTop="100dp"
            android:background="@drawable/button_red"
            />
     
            <Button
            android:id="@+id/buttonorange"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="300dp"
            android:layout_marginTop="190dp"
            android:background="@drawable/button_orange"
            />   
     
            <Button
            android:id="@+id/buttonyellow"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="220dp"
            android:layout_marginTop="215dp"
            android:background="@drawable/button_yellow"
            />
     
            <Button
            android:id="@+id/buttonlime"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="140dp"
            android:layout_marginTop="230dp"
            android:background="@drawable/button_lime"
            />   
     
           <Button
            android:id="@+id/buttonsky"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="60dp"
            android:layout_marginTop="215dp"
            android:background="@drawable/button_sky" />
     
            <Button
            android:id="@+id/buttonblue"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="25dp"
            android:layout_marginTop="150dp"
            android:background="@drawable/button_blue"
            />  
     
            <Button
            android:id="@+id/buttonpink"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="57dp"
            android:layout_marginTop="82dp"
            android:background="@drawable/button_pink" />        
     
            <Button
            android:id="@+id/buttongrey"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="120dp"
            android:layout_marginTop="40dp"
            android:background="@drawable/button_grey"
            />       
     
            <Button
            android:id="@+id/buttonwhite"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="195dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/button_white"
            />
     
            </LinearLayout>
     
    </RelativeLayout>
    Merci d'avance pour pouvoir m'aider

    Salutation

  2. #2
    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
    dp c'est pas indépendant de l'écran....

    La notion de DP est "similaire à l'oeil"... donc un truc de 30dp aura grosso modo la meille taille (en cm) de partout, quelque soit la taille de l'écran et le nombre de pixels....

    La règle ultime étant:
    px = dp * (dpi / 160)

    Sur un écran à 240dpi (GalaxySII), on aura donc px = dp * 1.5
    Sur un écran à 80dpi, on aura donc px = dp / 2

    Il y a plusieurs façons de réaliser ce que tu cherches... ma préférée est de tout passer en "pourcentage"...
    Le layout aura donc un background (la palette), au passage je ne sais pas trop à quoi sert l'ImageView (autant l'intégrer au background non ?)
    Et ensuite, positionner les boutons en fonction de la taille véritable (en pixels) du background...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Association cyberculturelle
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Association cyberculturelle
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci pour ta réponse nicroman

    Effectivement, je me suis perdu avec les DPI, en effet cela n'a rien à voir et je doit donc devoir travailler avec les pourcentages...

    Donc déja le background affiche juste le degradé bleu du fond. L'imageview sert a visualiser la palette de peinture qui est au format SVG. Enfin par dessus nous affichons nos boutons qui correspondent aux couleurs.

    J'ai cherchjé de informations pour positionner des objets dans le XML avec des pourcentages mais je n'ai pas trouvé grand chose a part cette instruction :

    android:layout_weight=".70"

    http://stackoverflow.com/questions/4...relativelayout

    J'ai essayé et mon bouton disparaît totalement.

    Suis-je entrain de suivre le bon chemin?


  4. #4
    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
    Oui et non....

    layout_weight permet au layout qui contient l'objet de savoir quel "poids" a cette objet....

    Donc un layout avec un total_weight de 10, et 3 objets de layout_weight respectifs 3,2,5 verra ses enfants prendre respéctivement 30%, 20% et 50% de la place du layout.

    Donc on parle bien de "width"... Pour positionner c'est autre chose....

    Une solution consiste à créer des 'view' vides avec les % correspondant aux positions, puis de placer les vrais boutons relativement à ces views...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Association cyberculturelle
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Association cyberculturelle
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci nicroman pour ces infos (1 an après je reviens ), bon j'avais un peu abandonné le projet (car il s'agit d'un projet purement personnel et bon parfais faute de temps... ) Et là c'est cool j'ai un peu de temps devant moi donc je vais essayer de me remettre dessus

    Donc j'ai tout ressorti et recompilé le projet avec la dernière version du SDK Android en API8 avec le nouvel Eclipse fourni avec déja tout préparé Android, qui d'ailleurs au passage je le trouve fantastique Et a priori tout est OK

    Pour en revenir a nos pourcentages, je crains que cela ne fonctionnera pas (si j'ai bien compris ton explication pour la raison suivante :

    Un machine ayant une résolution de 480 X 800, si on divise les deux valeurs on a un ratio de 0,6

    Une machine ayant une résolution de 480 X 854, on obtiens un ratio de 0,5620

    Poussons le vice encore plus loin :

    720 X 1280 on obtiens un ratio de 0,5625 (différence mineure)

    240 X 432 on obtiens un ratio de 0,5555 (différence mineure)

    240 X 400 on obtiens un ratio de 0,6 (différence mineure)

    Ce qui me permet de penser que quoi qu'il en soit, j'aurai toujours de légers décalages... ce qui dans un certain sens n'importe guère dans le cas de cette application.

    Néanmoins, durant cette année j'ai entendu parler des dossiers drawable-hdpi, drawable-ldpi, drawable-mdpi (High, Medium et Low DPI) - Ce qui d'après mes recherches sur le net, correspondent aux 3 différents "Standards" de ratio possibles sur du hard Android... En gros, je me fait 3 fois des fichiers XML avec des boutons gros, moyen et petits, cela voudrai dire que théoriquement, l'application quand elle se lance va automatiquement détecter si c'est du HDPI MDPI ou LDPI et prendre les ressources directement dans les bons dossiers qui correspondent? Et donc ceci corrigerai mon problème


  6. #6
    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
    A peu pret la même question qu'un autre membre du forum.

    Tant qu'on reste en "dp" le problème de résolution d'écran ne se pose pas.
    Et on n'a alors pas besoin de faire des layouts différents en fonction de la résolution (d'autant qu'il y en a 5, voir 7 avec les "non officiels", ou non encore déployés: ldpi,mdpi,hdpi,tvdpi,xhdpi,xxhdpi,xxxhdpi)

    Le device est dans l'une de ces résolutions. C'est sur et certain.
    La relation pixels / dp est alors constante.

    Le problème survient quand on veut prendre tout l'écran (le background)... car en effet tous les écrans n'ont pas le même ratio, loin de là (même si le 16:9 deviendra probablement la règle).
    Et surtout quand on veut "positionner" à la main un objet.

    Une possibilité (parmi d'autres):
    Utiliser un background d'une taille (en dps) de T
    Dans un FrameLayout qui prend tout l'écran luis mettre en background la couleur du "tour" de l'image de background précdent.
    A l'intérieur de ce FrameLayout, mettre un autre FrameLyout de la taille exacte du background (T en "dp"), et le centrer (layout_gravity="center"), lui coller en background l'image du background.
    Voilà, dans ce layout, tous les objets peuvent être positiionnés en "dp" et placés de manière correcte, même si l'écran change de ratio.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Association cyberculturelle
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Association cyberculturelle
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Ok merci pour l'info!

    J'ai pas vraiment clairement compris l'astuce que tu m'a expliqué, qui m'a l'air bien car sa a tout l'air d'être du 100% XML

    Néanmoins, j'ai suis entrain de refaire une version tout en dynamique, et travailler en pourcentages en divisant par la taille du layout utilisé pour le background... et positioner ensuite les boutons et leurs tailles (à l'ancienne )

    Pour le moment j'en suis là et j'arrive a disposer mes boutons correctement au pixel près :
    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
     
     
     public void onCreate(Bundle savedInstanceState) {
     
            super.onCreate(savedInstanceState);   
            this.setContentView(R.layout.main); 
     
            ScrollView sv = new ScrollView(this);
            sv.setBackgroundResource(R.drawable.backgnd_main);
     
            RelativeLayout rl_redbutton = new RelativeLayout(this);
            rl_redbutton.setPadding(20, 20, 0, 0);
     
            sv.addView(rl_redbutton);
     
     
            Button button_red = new Button(this);
            button_red.setBackgroundResource(R.drawable.button_red);
            button_red.setHeight(40);
            button_red.setWidth(40);
            rl_redbutton.addView(button_red);
     
     
            this.setContentView(sv);

  8. #8
    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 oui mais cela ne marchera pas si tu changes de résolution....

    L’inconvénient du positionnement "dans le code" est qu'à ce niveau tout est en "pixels"...

    Donc un setPadding(20,20,0,0) sera un padding de 20 pixels, soit... 20dp en mdpi, 13.33dp en hdpi, 10dp en xhdpi etc... 10dp, c'est tout petit comme bouton !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Association cyberculturelle
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Association cyberculturelle
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Je viens de trouver un code d'enfer : Il te donne en pixels la taille du Layout! Et non de l'ecran, la system bar est prise en compte ! Ce qui veut dire que j'ai plus qu'a travailler en pourcentage sur mes pixels et le tour est joué, pareil pour la taille des boutons, je vais détermier des "facteurs" de taille en fonction de la résolution...

    Je suis content, j'apprend bien ces jours-ci c'est cool

    Donc voici ce petit bout de code très interessant:

    http://www.codeproject.com/Tips/3138...yout#_comments

    (Je le recopie ici pour au cas ou que la source meurt un jour ne sait on jamais...)

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/mainroot"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:orientation="vertical"
      android:paddingTop="35dip" 
      android:paddingBottom="35dip" 
      android:paddingLeft="35dip" 
      android:paddingRight="35dip"
      android:gravity="center" >
     
      .....
      .....
    </LinearLayout>
    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
     
      @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.mainpage);
     
            // Get the layout id
            root = (LinearLayout) findViewById(R.id.mainroot);
            root.post(new Runnable() { 
            public void run() { 
                Rect rect = new Rect(); 
                Window win = getWindow();  // Get the Window
                win.getDecorView().getWindowVisibleDisplayFrame(rect); 
                // Get the height of Status Bar 
                int statusBarHeight = rect.top; 
                // Get the height occupied by the decoration contents 
                int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 
                // Calculate titleBarHeight by deducting statusBarHeight from contentViewTop  
                int titleBarHeight = contentViewTop - statusBarHeight; 
                Log.i("MY", "titleHeight = " + titleBarHeight + " statusHeight = " + statusBarHeight + " contentViewTop = " + contentViewTop); 
     
                // By now we got the height of titleBar & statusBar
                // Now lets get the screen size
                DisplayMetrics metrics = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(metrics);   
                int screenHeight = metrics.heightPixels;
                int screenWidth = metrics.widthPixels;
                Log.i("MY", "Actual Screen Height = " + screenHeight + " Width = " + screenWidth);   
     
                // Now calculate the height that our layout can be set
                // If you know that your application doesn't have statusBar added, then don't add here also. Same applies to application bar also 
                int layoutHeight = screenHeight - (titleBarHeight + statusBarHeight);
                Log.i("MY", "Layout Height = " + layoutHeight);   
     
               // Lastly, set the height of the layout       
               LinearLayout.LayoutParams rootParams = (android.widget.LinearLayout.LayoutParams)root.getLayoutParams();
               rootParams.height = layoutHeight;
               root.setLayoutParams(rootParams);      
            } 
           }); 
           Log.i("MY", "FINISHED OnCreate");
         }
    Et ici ce que l'on obtient en sortie dans le LOG

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    01-12 12:28:41.916: INFO/MY(198): FINISHED OnCreate
    01-12 12:28:42.196: INFO/CPP(198): titleHeight = 40 statusHeight = 25 contentViewTop = 65
    01-12 12:28:43.196: INFO/CPP(198): Actual Screen Height = 480 Width = 320 
    01-12 12:28:43.196: INFO/CPP(198): Layout Height = 415
    J'ai testé, sa marche! J'ai testé sur 3 modèles de telephones et 2 tablettes, les valeurs obtenues sont bonnes

    Je vais continuer le dev et voir si en effet tout se positionnera comme prévu partout

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Association cyberculturelle
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Association cyberculturelle
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bon j'ai continué aujourd'hui en implémentant la méthode précédente, maintenant le souci est à la création dynamique des boutons.

    Avec 1 bouton cela fonctionne parfaitement. Par contre quand j'en met un second, sa compile mais au moment de l'execution c'est le crash et le forçage de fermeture de l'application... A mon avis il y doit y avoir un conflit dans la création des relative layouts... Le scrollview n'a pas l'air d'en vouloir accepter plusieurs... Quelle est l'alernative au scrollview? Car chaque bouton à un relative layout, c'est ce qui me permet de les positionner au pixel près sur la fenêre...

    Voici le code :

    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
     
    ScrollView sv = new ScrollView(this);
    sv.setBackgroundResource(R.drawable.backgnd_main);
     
     
            RelativeLayout rl_redbutton = new RelativeLayout(this);
            rl_redbutton.setPadding((int)Math.round(screenWidth * 0.75) ,(int)Math.round(layoutHeight * 0.42), 0, 0);
            //                               BAS (le plus grand)       et        GAUCHE (Le plus court)
     
     
            RelativeLayout rl_orangebutton = new RelativeLayout(this);
            rl_orangebutton.setPadding((int)Math.round(screenWidth * 0.62) ,(int)Math.round(layoutHeight * 0.47), 0, 0);
            //                               BAS (le plus grand)       et        GAUCHE (Le plus court)
     
            sv.addView(rl_redbutton);
            sv.addView(rl_orangebutton);
     
     
            Button button_red = new Button(this);
            button_red.setBackgroundResource(R.drawable.button_red);
            button_red.setHeight(buttonsize);
            button_red.setWidth(buttonsize);
     
     
            Button button_orange = new Button(this);
            button_orange.setBackgroundResource(R.drawable.button_orange);
            button_orange.setHeight(buttonsize);
            button_orange.setWidth(buttonsize);
     
     
            rl_redbutton.addView(button_red);
            rl_orangebutton.addView(button_orange);
     
     
     
            this.setContentView(sv);
    Et voici le détail de l'erreur :

    09-30 11:00:07.585: E/AndroidRuntime(7188): FATAL EXCEPTION: main
    09-30 11:00:07.585: E/AndroidRuntime(7188): java.lang.RuntimeException: Unable to start activity : java.lang.IllegalStateException: ScrollView can host only one direct child

    Donc en effet c'est le scrollView qui pose problème, je l'ai donc remplacé par un LinearLayout. Néanmoins, il m'est impossible d'afficher les deux boutons...

    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
            LinearLayout main = new LinearLayout(this);
            main.setBackgroundResource(R.drawable.backgnd_main);
     
     
            RelativeLayout rl_redbutton = new RelativeLayout(this);
            rl_redbutton.setPadding((int)Math.round(screenWidth * 0.75) ,(int)Math.round(layoutHeight * 0.42), 0, 0);
            //                               BAS (le plus grand)       et        GAUCHE (Le plus court)
     
            Button button_red = new Button(this);
            button_red.setBackgroundResource(R.drawable.button_red);
            button_red.setHeight(buttonsize);
            button_red.setWidth(buttonsize);
     
            rl_redbutton.addView(button_red); 
            main.addView(rl_redbutton); 
     
     
     
    //////////////////////////////////////////////////////        
     
            RelativeLayout rl_orangebutton = new RelativeLayout(this);
            rl_orangebutton.setPadding((int)Math.round(screenWidth * 0.62) ,(int)Math.round(layoutHeight * 0.47), 0, 0);
            //                               BAS (le plus grand)       et        GAUCHE (Le plus court)
     
            Button button_orange = new Button(this);
            button_orange.setBackgroundResource(R.drawable.button_orange);
            button_orange.setHeight(buttonsize);
            button_orange.setWidth(buttonsize);
     
            rl_orangebutton.addView(button_orange);
            main.addView(rl_orangebutton); 
     
     
           this.setContentView(main);
    Je ne sais pas pourquoi les deux boutons ne sont pas visibles mais seulement un

    J'ai donc essayé de modifier le code comme ceci : Pareil, seulement un seul bouton s'affiche...


    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
            LinearLayout.LayoutParams layoutParams_redbutton = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
     
     
               layoutParams_redbutton.setMargins((int)Math.round(screenWidth * 0.75) ,(int)Math.round(layoutHeight * 0.42), 0, 0);
               //                               BAS (le plus grand)       et        GAUCHE (Le plus court)        
     
     
               Button button_red = new Button(this); 
               button_red.setBackgroundResource(R.drawable.button_red);
               button_red.setHeight(buttonsize);
               button_red.setWidth(buttonsize);
     
               main.addView(button_red, layoutParams_redbutton); 
     
            //////////////////////////////////////////////////////        
     
            LinearLayout.LayoutParams layoutParams_orangebutton = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
     
     
            layoutParams_orangebutton.setMargins((int)Math.round(screenWidth * 0.55) ,(int)Math.round(layoutHeight * 0.30), 0, 0);
               //                               BAS (le plus grand)       et        GAUCHE (Le plus court)        
     
     
               Button button_orange = new Button(this); 
               button_orange.setBackgroundResource(R.drawable.button_orange);
               button_orange.setHeight(buttonsize);
               button_orange.setWidth(buttonsize);
     
               main.addView(button_orange, layoutParams_orangebutton); 
     
     
            this.setContentView(main);
    Et enfin, j'arrive au bon résultat avec ce code-ci, je ne sais pas comment j'ai fait, j'ai du y arriver par hazard, mais bon, ma foi, sa à l'air de marcher

    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
            RelativeLayout main = new RelativeLayout(this);
            // Configuring the width and height of the linear layout.
            RelativeLayout.LayoutParams llLP = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT);
            main.setLayoutParams(llLP);
            main.setBackgroundResource(R.drawable.backgnd_main);
     
            //////////////////////////////////////////////////////        
     
            RelativeLayout.LayoutParams layoutParams_redbutton = new RelativeLayout.LayoutParams(buttonsize,buttonsize);       
            layoutParams_redbutton.setMargins((int)Math.round(screenWidth * 0.8) ,(int)Math.round(layoutHeight * 0.20), 0, 0);
            //                               BAS (le plus grand)       et        GAUCHE (Le plus court)        
            Button button_red = new Button(this); 
            button_red.setBackgroundResource(R.drawable.button_red);       
            main.addView(button_red, layoutParams_redbutton);         
     
            //////////////////////////////////////////////////////        
     
            RelativeLayout.LayoutParams layoutParams_orangebutton = new RelativeLayout.LayoutParams(buttonsize,buttonsize);
            layoutParams_orangebutton.setMargins((int)Math.round(screenWidth * 0.55) ,(int)Math.round(layoutHeight * 0.30), 0, 0);
            //                               BAS (le plus grand)       et        GAUCHE (Le plus court)        
            Button button_orange = new Button(this); 
            button_orange.setBackgroundResource(R.drawable.button_orange);
            main.addView(button_orange, layoutParams_orangebutton); 
     
            //////////////////////////////////////////////////////
     
            RelativeLayout.LayoutParams layoutParams_yellowbutton = new RelativeLayout.LayoutParams(buttonsize,buttonsize);
            layoutParams_yellowbutton.setMargins((int)Math.round(screenWidth * 0.30) ,(int)Math.round(layoutHeight * 0.70), 0, 0);
            //                               BAS (le plus grand)       et        GAUCHE (Le plus court)        
            Button button_yellow = new Button(this); 
            button_yellow.setBackgroundResource(R.drawable.button_yellow);
            main.addView(button_yellow, layoutParams_yellowbutton); 
     
            //////////////////////////////////////////////////////
     
            this.setContentView(main);

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/10/2012, 18h35
  2. Suivez l'actualité des projets avec le portail des projets
    Par Baptiste Wicht dans le forum Projets
    Réponses: 0
    Dernier message: 28/02/2010, 13h34
  3. Réponses: 4
    Dernier message: 24/08/2009, 13h56
  4. Réponses: 8
    Dernier message: 29/10/2008, 18h02
  5. Réponses: 22
    Dernier message: 03/01/2008, 22h42

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