36 votes

GridLayout hétérogène

Mise à JOUR - ma solution de travail: http://stackoverflow.com/a/21233824/902172


Je suis en train de mettre en œuvre la disposition ci-dessous:

Target Layout

Je suppose que GridLayout est adapté à mes besoins, mais après 2 heures de lutte, je ne pouvais pas créer encore une mise en page similaire.. La mise en page est le redimensionnement de lui-même, à tort, qu'il dépasse de l'écran du téléphone et elle aussi ne couvrent pas spécifié de lignes et de colonnes.

Ici j'ai sélectionné un bouton de sorte que vous pouvez voir comment il dépasse les limites:

Fail

et voici le xml code: https://gist.github.com/2834492

J'ai atteint une mise en page similaire avec imbriqué linearlayouts mais il n'est pas possible de redimensionner correctement pour les différentes tailles d'écran.


Mise à JOUR - approximative de LinearLayout mise en œuvre:

Le code XML: https://gist.github.com/cdoger/2835887 Cependant, le problème est qu'il n'est pas redimensionnée correctement voici quelques captures d'écran avec les différentes configurations d'écran:

http://i18.photobucket.com/albums/b122/floatercrop/581a0b67.jpg

http://i18.photobucket.com/albums/b122/floatercrop/65fc491a.jpg

http://i18.photobucket.com/albums/b122/floatercrop/5b119fc4.jpg


TLDR: quelqu'un Peut-il me montrer un groupe hétérogène de mise en page mise en œuvre avec GridLayout comme dans la première image?

19voto

Fuzzical Logic Points 5135

C. d.,

Le problème en question est due à une mauvaise utilisation de la GridLayout. Le GridLayout est fait pour montrer à ses enfants dans une grille et vous essayez de remplacer sans étendre le GridLayout. Tout ce que vous voulez peut être accompli dans le code (en utilisant numcolumns et taillecolonne), il ne sera pas utile pour plusieurs tailles d'écran sans un diable de beaucoup de code.

La seule solution adéquate qui n'ont pas besoin d'une tonne de piratage est l'utilisation judicieuse de deux LinearLayout et RelativeLayout. LinearLayout ne doit pas être utilisé exclusivement comme il est fait pour déposer des éléments dans une ligne (horizontale ou à la verticale seulement). Cela devient particulièrement évident lorsque vous essayez de le faire le fond de quatre boutons. Tandis que les boutons ci-dessus peut être fait avec LinearLayout avec très peu d'effort, RelativeLayout est ce que vous avez besoin pour le fond de quatre boutons.

Note: RelativeLayout peut être un peu tricksy pour ceux qui ont peu d'expérience de leur utilisation. Quelques écueils suivants: les enfants qui se chevauchent, les enfants se déplacer hors de l'écran, la hauteur et la largeur de rendu mal appliqués. Si vous voulez un exemple, laissez-moi savoir et je vais éditer ma réponse.

Note Finale: Je suis tout à fait en utilisant le cadre actuel des objets de manière unique, et préfèrent véritablement à fournir à la demande une solution. La solution, cependant, n'est pas viable, compte tenu des contraintes de la question.

(Révision) Solution 1

Après une dernière pensée de la nuit, cela peut être accompli avec un pur LinearLayout. Bien que je n'aime pas cette solution, il doit être multi-écran convivial et ne nécessite aucun outillage autour de moi. La prudence devrait être utilisée avec trop de LinearLayouts, selon Google, les développeurs, il peut entraîner la lenteur de chargement de l'Isu en raison de la layout_weight de la propriété. Une deuxième solution qui utilise RelativeLayout seront fournis lorsque je rentre à la maison. Maintenant Testé Ce paramètres de mise en page sur tous les écrans de tailles et d'orientations.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical">
        <LinearLayout 
            android:layout_width="match_parent" 
            android:layout_height="0dp" 
            android:layout_weight="1" 
            android:orientation="horizontal"> 
            <Button 
                android:id="@+id/Button01" 
                android:layout_width="0" 
                android:layout_height="match_parent" 
                android:layout_weight="1" 
                android:text="Button" />     
            <Button 
                android:id="@+id/Button02" 
                android:layout_width="0" 
                android:layout_height="match_parent" 
                android:layout_weight="1" 
                android:text="Button" />     
        </LinearLayout> 
        <Button 
            android:id="@+id/button3" 
            android:layout_width="match_parent" 
            android:layout_height="0dp"
            android:layout_weight="1" 
            android:text="Button" />   
        <LinearLayout 
            android:layout_width="match_parent" 
            android:layout_height="0dp" 
            android:layout_weight="1.00"
            android:orientation="horizontal">  
            <Button 
                android:id="@+id/button1" 
                android:layout_width="0dp" 
                android:layout_height="match_parent" 
                android:layout_weight="1" 
                android:text="Button" />   
            <Button 
                android:id="@+id/button2" 
                android:layout_width="0dp" 
                android:layout_height="match_parent" 
                android:layout_weight="1" 
                android:text="Button" />     
        </LinearLayout>
    </LinearLayout>    
    <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="0dp" 
        android:layout_weight="1" 
        android:orientation="horizontal">     
        <LinearLayout 
            android:layout_width="0dp" 
            android:layout_height="match_parent" 
            android:layout_weight="1" 
            android:orientation="vertical" >    
            <Button 
                android:id="@+id/button4" 
                android:layout_width="match_parent" 
                android:layout_height="0dp"
                android:layout_weight="1" 
                android:text="Button" />     
            <Button 
                android:id="@+id/button5" 
                android:layout_width="match_parent" 
                android:layout_height="0dp" 
                android:layout_weight="2" 
                android:text="Button" />     
        </LinearLayout>     
        <LinearLayout 
            android:layout_width="0dp" 
            android:layout_height="match_parent" 
            android:layout_weight="1" 
            android:orientation="vertical" > 
            <Button 
                android:id="@+id/button6" 
                android:layout_width="match_parent" 
                android:layout_height="0dp" 
                android:layout_weight="2" 
                android:text="Button" /> 
            <Button 
                android:id="@+id/button7" 
                android:layout_width="match_parent" 
                android:layout_height="0dp" 
                android:layout_weight="1" 
                android:text="Button" /> 
        </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

Solution 1 Explication

La clé de la LinearLayouts est de définir vos impératifs comme des modèles différents et nest les autres à eux. Comme vous appliquer des contraintes à d'autres dimensions, plus LinearLayouts doit être ajoutée à encapsuler les autres. Pour le tien, il a été essentiel d'avoir deux parents de plus, afin de maintenir la proportion. Un excellent indicateur de quand vous devez ajouter un autre niveau, c'est quand vous avez à utiliser layout_weight en utilisant rien d'autre qu'une valeur entière. Simplement, il devient difficile de calculer correctement. À partir de là, il était relativement simple de le diviser en colonnes.

Solution 2 (Échec)

Alors que j'étais en mesure d'atteindre les résultats désirés en utilisant RelativeLayout et "struts", je n'ai pu le faire avec les dispositions qui ont été multiples de 2 boutons en hauteur. Ces un truc qui serait génial que les niveaux de mise en page sont considérablement réduits, de sorte que je travaille sur un pur XML solution et poster la réponse ici, si et quand j'y parvenir. Dans l'intervalle, le LinearLayout ci-dessus devrait répondre à vos besoins parfaitement.

Espérons que cela aide,

FuzzicalLogic

16voto

Risch Points 317

J'ai lu ce fil et réalisé que je voulais un plat solution que ceux avec des linéaires de mise en page. Après quelques recherches, j'ai fini par faire ma propre mise en page. Il est inspiré par un GridLayout mais diffère un peu.

Veuillez noter que si vous copiez-collez le code que vous aurez besoin de changer les noms de package dans certains endroits.

Cette disposition a 4 paramètres de mise en page que les enfants utilisent pour se positionner.Ce sont layout_left, layout_top, layout_right, layout_bottom. Le ICGridLayout a deux attributs: layout_spacing et de colonnes.

Les colonnes indique la mise en page le nombre de colonnes que vous voulez qu'il contient. Il va alors calculer la taille d'une cellule à la même hauteur que de largeur. Qui seront les dispositions de la largeur des colonnes.

L' espacement est la quantité d'espace que vous souhaitez entre chaque enfant.

Le layout_left|haut|droite|bas attributs sont les coordonnées de chaque côté. La mise en page n'a pas de calculs afin d'éviter la collision ou quoi que ce soit. Il met juste les enfants là où ils veulent être.

Si vous souhaitez avoir de plus petits carrés, vous avez juste à augmenter les colonnes de l'attribut.

Gardez à l'esprit que c'est un prototype rapide, je vais continuer à travailler sur elle, et quand je sens qu'il est prêt, je vais le télécharger à Github et de mettre un commentaire ici.

L'ensemble de mon code ci-dessous devrait produire le résultat suivant: Layout when using my provided code

*EDIT*** Ajouté à l'appel de mesure pour les enfants, oublié que la première fois autour. FIN EDIT ICGridLayout.java:

package com.risch.evertsson.iclib.layout;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import com.risch.evertsson.iclib.R;

/**
 * Created by johanrisch on 6/13/13.
 */
public class ICGridLayout extends ViewGroup {
    private int mColumns = 4;
    private float mSpacing;

    public ICGridLayout(Context context) {
        super(context);
    }

    public ICGridLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs);
    }

    public ICGridLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs);
    }

    private void init(AttributeSet attrs) {
        TypedArray a = getContext().obtainStyledAttributes(
                attrs,
                R.styleable.ICGridLayout_Layout);
        this.mColumns = a.getInt(R.styleable.ICGridLayout_Layout_columns, 3);
        this.mSpacing = a.getDimension(R.styleable.ICGridLayout_Layout_layout_spacing, 0);
        a.recycle();
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        if (changed) {
            int width = (int) (r - l);
            int side = width / mColumns;
            int children = getChildCount();
            View child = null;
            for (int i = 0; i < children; i++) {
                child = getChildAt(i);
                LayoutParams lp = (LayoutParams) child.getLayoutParams();
                int left = (int) (lp.left * side + mSpacing / 2);
                int right = (int) (lp.right * side - mSpacing / 2);
                int top = (int) (lp.top * side + mSpacing / 2);
                int bottom = (int) (lp.bottom * side - mSpacing / 2);
                child.layout(left, top, right, bottom);
            }
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        measureVertical(widthMeasureSpec, heightMeasureSpec);

    }

    private void measureVertical(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int width = 0;
        int height = 0;


        if (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.EXACTLY) {
            width = MeasureSpec.getSize(widthMeasureSpec);
        } else {
            throw new RuntimeException("widthMeasureSpec must be AT_MOST or " +
                    "EXACTLY not UNSPECIFIED when orientation == VERTICAL");
        }


        View child = null;
        int row = 0;
        int side = width / mColumns;
        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            child = getChildAt(i);

            LayoutParams lp = (LayoutParams) child.getLayoutParams();

            if (lp.bottom > row) {
                row = lp.bottom;
            }



            int childHeight = (lp.bottom - lp.top)*side;
            int childWidth = (lp.right-lp.left)*side;
            int heightSpec = MeasureSpec.makeMeasureSpec(childHeight, LayoutParams.MATCH_PARENT);
            int widthSpec = MeasureSpec.makeMeasureSpec(childWidth, LayoutParams.MATCH_PARENT);

            child.measure(widthSpec, heightSpec);
        }
        height = row * side;
        // TODO: Figure out a good way to use the heightMeasureSpec...

        setMeasuredDimension(width, height);
    }

    @Override
    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new ICGridLayout.LayoutParams(getContext(), attrs);
    }

    @Override
    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
        return p instanceof ICGridLayout.LayoutParams;
    }

    @Override
    protected ViewGroup.LayoutParams
            generateLayoutParams(ViewGroup.LayoutParams p) {
        return new ICGridLayout.LayoutParams(p);
    }

    @Override
    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
        return new LayoutParams();
    }

    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
        int right = 1;
        int bottom = 1;
        int top = 0;
        int left = 0;
        int width = -1;
        int height = -1;

        public LayoutParams() {
            super(MATCH_PARENT, MATCH_PARENT);
            top = 0;
            left = 1;
        }

        public LayoutParams(int width, int height) {
            super(width, height);
            top = 0;
            left = 1;
        }

        public LayoutParams(Context context, AttributeSet attrs) {
            super(context, attrs);
            TypedArray a = context.obtainStyledAttributes(
                    attrs,
                    R.styleable.ICGridLayout_Layout);
            left = a.getInt(R.styleable.ICGridLayout_Layout_layout_left, 0);
            top = a.getInt(R.styleable.ICGridLayout_Layout_layout_top, 0);
            right = a.getInt(R.styleable.ICGridLayout_Layout_layout_right, left + 1);
            bottom = a.getInt(R.styleable.ICGridLayout_Layout_layout_bottom, top + 1);
            height = a.getInt(R.styleable.ICGridLayout_Layout_layout_row_span, -1);
            width = a.getInt(R.styleable.ICGridLayout_Layout_layout_col_span, -1);
            if (height != -1) {
                bottom = top + height;
            }
            if (width != -1) {
                right = left + width;
            }

            a.recycle();
        }

        public LayoutParams(ViewGroup.LayoutParams params) {
            super(params);
        }

    }

}

ICGridLayout.java est assez simple. Il prend les valeurs fournies par les enfants et les dépose. attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ICGridLayout_Layout">
        <attr name="columns" format="integer"/>
        <attr name="layout_left" format="integer"/>
        <attr name="layout_top" format="integer"/>
        <attr name="layout_right" format="integer"/>
        <attr name="layout_bottom" format="integer"/>
        <attr name="layout_col_span" format="integer"/>
        <attr name="layout_row_span" format="integer"/>
        <attr name="layout_spacing" format="dimension"/>
    </declare-styleable>

</resources>

example_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.rischit.projectlogger"
    android:id="@+id/scroller"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.risch.evertsson.iclib.layout.ICGridLayout
        android:id="@+id/ICGridLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_spacing="4dp"
        app:columns="4" >


        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_bottom="1"
            app:layout_left="0"
            app:layout_right="4"
            app:layout_top="0"
            android:background="#ff0000"
            android:text="TextView" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_bottom="3"
            app:layout_left="3"
            app:layout_right="4"
            app:layout_top="1"
            android:background="#00ff00"
            android:text="TextView" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_bottom="4"
            app:layout_left="0"
            app:layout_right="3"
            app:layout_top="1"
            android:background="#0000ff"
            android:text="TextView" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_bottom="4"
            app:layout_left="3"
            app:layout_right="4"
            app:layout_top="3"
            android:background="#ffff00"
            android:text="TextView" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_bottom="6"
            app:layout_left="0"
            app:layout_right="1"
            app:layout_top="4"
            android:background="#ff00ff"
            android:text="TextView" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_bottom="6"
            app:layout_left="1"
            app:layout_right="4"
            app:layout_top="4"
            android:background="#ffffff"
            android:text="TextView" />
    </com.risch.evertsson.iclib.layout.ICGridLayout>

</ScrollView>

-- Johan Risch

P. S C'est ma première réponse, j'ai essayé de le faire d'une manière correcte. Si j'ai échoué s'il vous plaît dites-moi sans flamber :) D. S

10voto

Skies Points 189

Comme ça ?

entrez la description de l'image ici

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.54" >
        <Button
            android:id="@+id/Button01"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.00"
            android:text="Button" />    
        <Button
            android:id="@+id/Button02"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.00"
            android:text="Button" />    
    </LinearLayout>
    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />  
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="99dp" > 
        <Button
            android:id="@+id/button1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Button" />  
        <Button
            android:id="@+id/button2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Button" />    
    </LinearLayout>   
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical" >   
            <Button
                android:id="@+id/button4"
                android:layout_width="match_parent"
                android:layout_height="152dp"
                android:text="Button" />    
            <Button
                android:id="@+id/button5"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Button" />    
        </LinearLayout>    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical" >
            <Button
                android:id="@+id/button6"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Button" />
            <Button
                android:id="@+id/button7"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="Button" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>
 

8voto

Gene Points 20184

Comme beaucoup l'ont dit, les dispositions linéaires imbriquées semblent être le seul moyen de gagner ici. Certaines solutions n'ont pas utilisé les paramètres de disposition de la manière la plus flexible. Le code ci-dessous cherche à le faire, et d'une manière robuste avec les changements de rapport d'aspect. Les détails sont dans les commentaires.

entrez la description de l'image iciPaysage

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- First row. -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <!-- Equal weights cause two columns of equal width. -->

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="A" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="B" />
    </LinearLayout>

    <!-- Second row. -->

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="C" />

    <!-- Third row. -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <!-- Equal weights cause two columns of equal width. -->

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="D" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="E" />
    </LinearLayout>

    <!-- Uneven fourth and fifth rows. -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:baselineAligned="false" >

        <!-- Left column. Equal weight with right column gives them equal width. -->

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical" >

            <!--
                 The use of weights below assigns all extra space to G. There
                 are other choices. LinearLayout computes sizes along its
                     axis as given, then divides the remaining extra space using
                 weights.  If a component doesn't have a weight, it keeps
                 the specified size exactly.
            -->


            <!-- Fill width of layout and use wrap height (because there's no weight). -->

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="F" />

            <!-- Fill width of layout and put all the extra space here. -->

            <Button
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:text="G" />
        </LinearLayout>

        <!-- Right column. Equal weight with left column gives them equal width. -->

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical" >

            <!-- Same as above except top button gets all the extra space. -->

            <Button
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:text="H" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="I" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>
 

4voto

Skies Points 189

J'ai essayé ce tuto

Je suis bloqué ici:

entrez la description de l'image ici

 <?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:columnCount="2"
    android:orientation="horizontal" >

    <Button android:text="1" />

    <Button android:text="2" />

    <Button
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:text="3" />

    <Button android:text="4" />

    <Button android:text="5" />

    <Button
        android:layout_gravity="fill"
        android:layout_rowSpan="2"
        android:text="6" />

    <Button android:text="7" />

    <Button android:text="8" />

    <Button android:text="9" />

</GridLayout>
 

Impossible pour moi d'étendre le 8ème bouton. : s

J'ai essayé

 <Button android:text="8" android:layout_gravity="fill" android:layout_rowSpan="2"/>
 

Mais c'est inefficace. : s

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