web-dev-qa-db-fra.com

GridLayout (pas GridView) comment étirer tous les enfants de manière uniforme

Je veux avoir une grille 2x2 avec des boutons à l'intérieur. Ceci est seulement ICS donc j'essaie d'utiliser le nouveau GridLayout donné.

Voici le XML de ma mise en page:

 <?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/favorites_grid"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="#00ff00"
    Android:rowCount="2"
    Android:columnCount="2">
  <Button
      Android:text="Cell 0"
      Android:layout_row="0"
      Android:layout_column="0"
      Android:textSize="14dip" />
  <Button
      Android:text="Cell 1"
      Android:layout_row="0"
      Android:layout_column="1"
      Android:textSize="14dip" />

  <Button
      Android:text="Cell 2"
      Android:layout_row="1"
      Android:layout_column="0"
      Android:textSize="14dip" />
  <Button
      Android:text="Cell 3"
      Android:layout_row="1"
      Android:layout_column="1"
      Android:textSize="14dip" />
</GridLayout>

Le problème est que mes vues ne s'étendent pas uniformément pour chaque rangée. Cela provoque beaucoup d'espace supplémentaire à droite de ma GridLayout.

J'ai essayé de définir layout_gravity="fill_horizontal" mais cela ne s'applique qu'à la vue last de la ligne. Cela signifie que la cellule 1 s’étire jusqu’à laisser suffisamment d’espace pour la cellule 0.

Des réflexions sur la manière de s’y attaquer?

203
dnkoutso

UPDATE: les poids sont pris en charge à partir de l'API 21. Voir réponse de PaulT pour plus de détails. END UPDATE Il y a des limites lors de l'utilisation de GridLayout, la citation suivante est extraite de documentation .

"GridLayout ne prend pas en charge le principe de poids défini dans le poids. En général, il n'est donc pas possible de configurer un GridLayout pour répartir l'espace en excès dans des proportions non triviales entre plusieurs lignes ou colonnes ... Pour un contrôle complet sur distribution d'espace en excès dans une ligne ou une colonne; utilisez une sous-vue LinearLayout pour contenir les composants du groupe de cellules associé. "

Voici un petit exemple utilisant les sous-vues LinearLayout. (J'ai utilisé Space Views qui occupe la zone non utilisée et pousse les boutons dans la position souhaitée.)

<GridLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:columnCount="1"
>
    <TextView
        Android:text="2x2 button grid"
        Android:textSize="32dip"
        Android:layout_gravity="center_horizontal" />

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" Android:orientation="horizontal">
        <Space
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:layout_weight="1" />
        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Button 1" />
        <Space
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:layout_weight="1" />
        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="start"
            Android:text="Button 2" />
        <Space
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="horizontal"
    >
        <Space
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:layout_weight="1" />
        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Button 3" />
        <Space
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:layout_weight="1" />
        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="start"
            Android:text="Button 4" />
        <Space
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:layout_weight="1" />
    </LinearLayout>
</GridLayout>
70
HenrikS

À partir de l'API 21, la notion de poids a été ajoutée à GridLayout. Pour prendre en charge les anciens appareils Android, vous pouvez utiliser GridLayout à partir de la bibliothèque de support de la v7.

Le code XML suivant donne un exemple d'utilisation des poids pour remplir la largeur de l'écran.

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.GridLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:grid="http://schemas.Android.com/apk/res-auto"

    Android:id="@+id/choice_grid"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_centerHorizontal="true"
    Android:padding="4dp"

    grid:alignmentMode="alignBounds"
    grid:columnCount="2"
    grid:rowOrderPreserved="false"
    grid:useDefaultMargins="true">

    <TextView
        Android:layout_width="0dp"
        Android:layout_height="100dp"
        grid:layout_columnWeight="1"
        grid:layout_gravity="fill_horizontal"
        Android:gravity="center"
        Android:background="#FF33B5E5"
        Android:text="Tile1" />

    <TextView
        Android:layout_width="0dp"
        Android:layout_height="100dp"
        grid:layout_columnWeight="1"
        grid:layout_gravity="fill_horizontal"
        Android:gravity="center"
        Android:background="#FF33B5E5"
        Android:text="Tile2" />

    <TextView
        Android:layout_width="0dp"
        Android:layout_height="100dp"
        grid:layout_columnWeight="1"
        grid:layout_gravity="fill_horizontal"
        Android:gravity="center"
        Android:background="#FF33B5E5"
        Android:text="Tile3" />

    <TextView
        Android:layout_width="0dp"
        Android:layout_height="100dp"
        grid:layout_columnWeight="1"
        grid:layout_gravity="fill_horizontal"
        Android:gravity="center"
        Android:background="#FF33B5E5"
        Android:text="Tile4" />

</Android.support.v7.widget.GridLayout>
300
PaulT

enter image description here

Appcompat21 GridLayout a les poids de colonne et de ligne qui peuvent être utilisés comme ci-dessous pour créer uniformément chaque élément de la grille dans la grille comme l'image ci-dessus.

<Android.support.v7.widget.GridLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:grid="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_centerHorizontal="true"
grid:alignmentMode="alignBounds"
grid:columnCount="4">
<Button Android:layout_width="0dp"
    style="?buttonStyle"
    Android:layout_height="0dp"
    Android:text="-1"
    grid:layout_columnWeight="1"
    grid:layout_rowWeight="1"
    grid:layout_gravity="fill"/>
...
...
...
68
onusopus

Vous pouvez définir la largeur de chaque enfant de manière dynamique:

GridLayout.LayoutParams params = (GridLayout.LayoutParams) child.getLayoutParams();
    params.width = (parent.getWidth()/parent.getColumnCount()) -params.rightMargin - params.leftMargin;
    child.setLayoutParams(params);
35
Rotemmiz

Démarrage dans API 21 sans bibliothèque de support v7 avec ScrollView:

enter image description here

XML:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    >

    <GridLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:columnCount="2"
            >

        <TextView
            Android:layout_width="0dp"
            Android:layout_height="100dp"
            Android:layout_columnWeight="1"
            Android:gravity="center"
            Android:layout_gravity="fill_horizontal"
            Android:background="@color/colorAccent"
            Android:text="Tile1" />

        <TextView
            Android:layout_width="0dp"
            Android:layout_height="100dp"
            Android:layout_columnWeight="1"
            Android:gravity="center"
            Android:layout_gravity="fill_horizontal"
            Android:background="@color/colorPrimaryDark"
            Android:text="Tile2" />

        <TextView
            Android:layout_width="0dp"
            Android:layout_height="100dp"
            Android:layout_columnWeight="1"
            Android:gravity="center"
            Android:layout_gravity="fill_horizontal"
            Android:background="@color/colorPrimary"
            Android:text="Tile3" />

        <TextView
            Android:layout_width="0dp"
            Android:layout_height="100dp"
            Android:layout_columnWeight="1"
            Android:gravity="center"
            Android:layout_gravity="fill_horizontal"
            Android:background="@color/colorAccent"
            Android:text="Tile4" />

    </GridLayout>
</ScrollView>
33
t0m

Essayez d’ajouter ce qui suit à vos spécifications GridLayout. Cela devrait fonctionner.

Android:useDefaultMargins="true"
12
Aviral

C'est la bonne réponse

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/favorites_grid"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="#00ff00"
    Android:rowCount="2"
    Android:columnCount="2">
    <Button
        Android:text="Cell 0"
        Android:layout_row="0"
        Android:layout_column="0"
        Android:layout_columnWeight="1"
        Android:layout_rowWeight="1"
        Android:textSize="14dip" 
        />
    <Button
        Android:text="Cell 1"
        Android:layout_row="0"
        Android:layout_column="1"
        Android:textSize="14dip"
        Android:layout_columnWeight="1"
        Android:layout_rowWeight="1"/>

    <Button
        Android:text="Cell 2"
        Android:layout_row="1"
        Android:layout_column="0"
        Android:textSize="14dip"
        Android:layout_columnWeight="1"
        Android:layout_rowWeight="1"/>
    <Button
        Android:text="Cell 3"
        Android:layout_row="1"
        Android:layout_column="1"
        Android:textSize="14dip"
        Android:layout_columnWeight="1"
        Android:layout_rowWeight="1"/>
</GridLayout>
10
the_prole

Dans mon cas, j’ajoutais les boutons de manière dynamique; ma solution nécessitait donc une partie XML et une partie Java. Je devais trouver et mélanger des solutions provenant de différents endroits et je pensais la partager ici afin que quelqu'un d'autre à la recherche d'une solution similaire puisse la trouver utile.

Première partie de mon fichier de mise en page XML ...

<Android.support.v7.widget.GridLayout
    xmlns:grid="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/gl_Options"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    grid:useDefaultMargins="true">
</Android.support.v7.widget.GridLayout>

grid:useDefaultMargins="true" n'est pas obligatoire, mais j'ai ajouté parce que cela me paraissait mieux, vous pouvez appliquer d'autres effets visuels (par exemple, un remplissage) comme mentionné dans certaines réponses ici. Maintenant, pour les boutons, je dois les ajouter dynamiquement. Voici la partie Java de mon code permettant de créer ces boutons. J'inclue uniquement les lignes relatives à ce contexte. Supposons que je doive créer des boutons avec autant de myOptions disponibles dans mon code et que je ne copie pas non plus le code OnClickListener.

import Android.support.v7.widget.GridLayout;   //Reference to Library

public class myFragment extends Fragment{
    GridLayout gl_Options;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        gl_AmountOptions = (GridLayout)view.findViewById( R.id.gl_AmountOptions );
        ...
        gl_Options.removeAllViews();     // Remove all existing views
        gl_AmountOptions.setColumnCount( myOptions.length <= 9 ? 3: 4 );  // Set appropriate number of columns

        for( String opt : myOptions ) {
            GridLayout.LayoutParams lParams   = new GridLayout.LayoutParams( GridLayout.spec( GridLayout.UNDEFINED, 1f), GridLayout.spec( GridLayout.UNDEFINED, 1f));
            // The above defines LayoutParameters as not specified Column and Row with grid:layout_columnWeight="1" and grid:layout_rowWeight="1"
            lParams.width = 0;    // Setting width to "0dp" so weight is applied instead

            Button b = new Button(this.getContext());
            b.setText( opt );
            b.setLayoutParams(lParams);
            b.setOnClickListener( myClickListener );
            gl_Options.addView( b );
        }
    }
}

Comme nous utilisons GridLayout à partir de la bibliothèque de support et pas le GridLayout standard, nous devons en informer le niveau dans le fichier YourProject.grade.

dependencies {
    compile 'com.Android.support:appcompat-v7:23.4.0'
    ...
    compile 'com.Android.support:gridlayout-v7:23.4.0'
}
6
Nashe

J'ai finalement trouvé la solution. Comme l'a dit Rotemmiz, vous devez le faire dynamiquement par la suite. Ce code étend les boutons pour remplir la vue horizontalement, mais la même chose peut être faite pour verticalement.

public void fillview(Android.support.v7.widget.GridLayout gl)
{
    Button buttontemp;

    //Stretch buttons
    int idealChildWidth = (int) ((gl.getWidth()-20*gl.getColumnCount())/gl.getColumnCount());
    for( int i=0; i< gl.getChildCount();i++)
    {
        buttontemp = (Button) gl.getChildAt(i);
        buttontemp.setWidth(idealChildWidth);
    }
}

(Le 20 concerne les marges internes et externes. Cela pourrait être fait de manière plus universelle, mais c'est beaucoup plus propre)

Ensuite, il peut s'appeler comme ceci:

    Android.support.v7.widget.GridLayout gl = (Android.support.v7.widget.GridLayout)findViewById(R.id.buttongrid);
    ViewTreeObserver vto = gl.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Override public void onGlobalLayout() 
    {

            Android.support.v7.widget.GridLayout gl = (Android.support.v7.widget.GridLayout) findViewById(R.id.buttongrid);
            fillview(gl);

            ViewTreeObserver obs = gl.getViewTreeObserver();
            obs.removeGlobalOnLayoutListener(this);
    }});

Cela doit être fait avec un observateur car nous devons attendre que la vue soit établie avant d'appeler les vues.

6
dberm22

Vous pouvez accélérer ce processus en substituant la méthode ViewGroup onLayout. Ceci est ma solution universelle:

package your.app.package;

import Android.content.Context;
import Android.view.ViewGroup;

public class GridLayout extends ViewGroup {

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

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        final int columns = 2;//edit this if you need different grid
        final int rows = 2;

        int children = getChildCount();
        if (children != columns * rows)
            throw new IllegalStateException("GridLayout must have " + columns * rows + " children");

        int width = getWidth();
        int height = getHeight();


        int viewWidth = width / columns;
        int viewHeight = height / rows;

        int rowIndex = 0;
        int columnIndex = 0;

        for (int i = 0; i < children; i++) {
            getChildAt(i).layout(viewWidth * columnIndex, viewHeight * rowIndex, viewWidth * columnIndex + viewWidth, viewHeight * rowIndex + viewHeight);
            columnIndex++;
            if (columnIndex == columns) {
                columnIndex = 0;
                rowIndex++;
            }
        }
    }

}

EDIT: N'oubliez pas match_parent pour les enfants!

Android:layout_width="match_parent"
Android:layout_height="match_parent"
3
user1557434

La meilleure solution que je puisse trouver consiste à utiliser une disposition linéaire (horizontale) pour chaque ligne de votre choix et d'affecter à cette dernière la largeur du bouton (cellule) à 0dp et le poids à 1. Pour chaque disposition linéaire (lignes), attribuez la hauteur. Trouver le code ci-dessous - également Android: layout_gravity = "center_vertical" est utilisé pour aligner les boutons dans une ligne s'ils contiennent du texte de longueur variable. Utilisation de 0dp et poids c'est un truc assez soigné mais pas si bien connu.

<LinearLayout
 Android:id="@+id/parent_layout"
 Android:layout_width="match_parent"
 Android:layout_height="wrap_content"
 Android:background="@drawable/button_bue_3d"
 Android:orientation="vertical" >

            <LinearLayout
                Android:id="@+id/layout_row1"
                Android:layout_width="match_parent"
                Android:layout_height="0dp"
                Android:layout_weight="1"

                Android:orientation="horizontal" >

                <Button
                    Android:id="@+id/button1"
                    style="?android:attr/buttonStyleSmall"
                   Android:layout_height="wrap_content"
                   Android:layout_width="0dp"
                   Android:layout_weight="1"
                    Android:clickable="false"
                   Android:layout_gravity="center_vertical"
                    Android:text="ssssssssssssssssssssssssss" />

                <Button
                    Android:id="@+id/button2"
                    style="?android:attr/buttonStyleSmall"
                    Android:clickable="false"
                    Android:layout_height="wrap_content"
                     Android:layout_width="0dp"
                   Android:layout_weight="1"
                   Android:layout_gravity="center_vertical"
                    Android:text="sggggggg" />


            </LinearLayout>

            <LinearLayout
                Android:id="@+id/layout_row2"
                Android:layout_weight="1"
                Android:layout_width="match_parent"
                  Android:layout_height="0dp"

                Android:orientation="horizontal" >

                <Button
                    Android:id="@+id/button3"
                    style="?android:attr/buttonStyleSmall"
                    Android:layout_height="wrap_content"
                     Android:layout_width="0dp"
                   Android:layout_weight="1"
                    Android:layout_gravity="center_vertical"
                    Android:text="s" />

                <Button
                    Android:id="@+id/button4"
                    style="?android:attr/buttonStyleSmall"
                    Android:layout_height="wrap_content"
                     Android:layout_width="0dp"
                   Android:layout_weight="1"
                    Android:clickable="false"
                     Android:layout_gravity="center_vertical"
                    Android:text="s" />


            </LinearLayout>


       </LinearLayout>
2
jai

Vous voilà :

Button button = new Button(this);
// weight = 1f , gravity = GridLayout.FILL 
GridLayout.LayoutParams param= new GridLayout.LayoutParams(GridLayout.spec(
            GridLayout.UNDEFINED,GridLayout.FILL,1f),
            GridLayout.spec(GridLayout.UNDEFINED,GridLayout.FILL,1f));
// Layout_height = 0 ,Layout_weight = 0
params.height =0;                                                                                                           
params.width = 0;
button.setLayoutParams(param);
1
Nguyen Hoà

Ancienne question, mais je voulais ajouter ma solution. J'ai créé une "disposition de grille linéaire" qui simule une grille mais en utilisant des dispositions linéaires imbriquées. Cela lui permet de s'étirer pour remplir l'espace.

http://zerocredibility.wordpress.com/2014/12/18/linear-grid-layout/

0
Jeffrey Blattman

C'est une question assez ancienne, mais qui intéresse évidemment beaucoup de gens. Pour une disposition simple de 4 boutons comme celui-ci, il semble qu'un TableLayout soit le moyen le plus simple d'obtenir le résultat souhaité.

Voici un exemple de code montrant les 2 premières lignes d'un tableau avec 6 colonnes couvrant la largeur de son parent. LinearLayout et ImageView dans chaque cellule sont utilisés pour permettre l’activation et la désactivation d’une image dans la cellule tout en maintenant la couleur de la cellule.

<TableLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:stretchColumns="1,2,3,4,5,6"
    Android:background="@drawable/vertical_radio_button_background"
    Android:padding="2dp">

    <TableRow
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <LinearLayout
            Android:id="@+id/brown"
            Android:tag="13"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="1"
            Android:background="@color/brown">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/maraschino"
            Android:tag="9"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="2"
            Android:background="@color/maraschino">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/cayenne"
            Android:tag="22"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="3"
            Android:background="@color/cayenne">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/maroon"
            Android:tag="18"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="4"
            Android:background="@color/maroon">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/Plum"
            Android:tag="3"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="5"
            Android:background="@color/Plum">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/eggplant"
            Android:tag="15"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="6"
            Android:background="@color/eggplant">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>
    </TableRow>

    <TableRow
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <LinearLayout
            Android:id="@+id/Plum2"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="1"
            Android:background="@color/Plum">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/lavender"
            Android:tag="14"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="2"
            Android:background="@color/lavender">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/carnation"
            Android:tag="16"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="3"
            Android:background="@color/carnation">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/light_pink"
            Android:tag="23"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="4"
            Android:background="@color/light_pink">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/strawberry"
            Android:tag="10"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="5"
            Android:background="@color/strawberry">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>

        <LinearLayout
            Android:id="@+id/Magenta"
            Android:tag="20"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:layout_margin="1dp"
            Android:layout_column="6"
            Android:background="@color/Magenta">

            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="5dp"
                Android:src="@drawable/selected_check"
                Android:visibility="invisible"/>
        </LinearLayout>
    </TableRow>
</TableLayout>
0
hBrent

Je souhaite que cela aide quelqu'un

Résultat

enter image description here

enter image description here

Code:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.GridLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:grid="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 0x0"
        grid:layout_column="0"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="0"
        grid:layout_rowWeight="1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 0x1"
        grid:layout_column="1"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="0"
        grid:layout_rowWeight="1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 0x2"
        grid:layout_column="2"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="0"
        grid:layout_rowWeight="1" />


    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 1x0"
        grid:layout_column="0"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="1"
        grid:layout_rowWeight="1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 1x1"
        grid:layout_column="1"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="1"
        grid:layout_rowWeight="1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 1x2"
        grid:layout_column="2"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="1"
        grid:layout_rowWeight="1" />


    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 2x0"
        grid:layout_column="0"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="2"
        grid:layout_rowWeight="1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 2x1"
        grid:layout_column="1"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="2"
        grid:layout_rowWeight="1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 2x2"
        grid:layout_column="2"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="2"
        grid:layout_rowWeight="1" />


    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 3x0"
        grid:layout_column="0"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="3"
        grid:layout_rowWeight="1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 3x1"
        grid:layout_column="1"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="3"
        grid:layout_rowWeight="1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="item 3x2"
        grid:layout_column="2"
        grid:layout_columnWeight="1"
        grid:layout_gravity="center"
        grid:layout_row="3"
        grid:layout_rowWeight="1" />

</Android.support.v7.widget.GridLayout>
0
Zain

Résultat :

enter image description here

Essayez quelque chose comme ça:

    final int MAX_COLUMN = gridView.getColumnCount(); //5
    final int MAX_ROW = gridView.getRowCount(); //7
    final int itemsCount = MAX_ROW * MAX_COLUMN; //35

    int row = 0, column = 0;

    for (int i = 0; i < itemsCount; i++) {
        ImageView view = new ImageView(this);

        //Just to provide alternate colors
        if (i % 2 == 0) {
            view.setBackgroundColor(Color.RED);
        } else {
            view.setBackgroundColor(Color.GREEN);
        }

        GridLayout.LayoutParams params = new GridLayout.LayoutParams(GridLayout.spec(row, 1F), GridLayout.spec(column, 1F));
        view.setLayoutParams(params);
        gridView.addView(view);

        column++;

        if (column >= MAX_COLUMN) {
            column = 0;
            row++;
        }
    }

Si vous voulez une largeur et une hauteur spécifiques pour vos cellules, utilisez:

     params.width = 100; // Your width
     params.height = 100; //your height
0
Eldhose M Babu

C'est le code pour plus d'applications par défaut sans les boutons, c'est très pratique pour moi

<GridLayout
   xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:layout_width="match_parent"
   Android:layout_height="wrap_content"
   Android:columnCount="1"
   >
   <TextView
       Android:text="2x2 button grid"
       Android:textSize="32dip"
       Android:layout_gravity="center_horizontal" />

   <LinearLayout
       Android:layout_width="match_parent"
       Android:layout_height="wrap_content"
       Android:orientation="horizontal">
       <Space
           Android:layout_width="wrap_content"
           Android:layout_height="match_parent"
           Android:layout_weight="1" />
       <TextView
           Android:layout_width="wrap_content"
           Android:layout_height="wrap_content"
           Android:text="Naam" />
       <Space
           Android:layout_width="wrap_content"
           Android:layout_height="match_parent"
           Android:layout_weight="1" />
       <TextView
           Android:layout_width="wrap_content"
           Android:layout_height="wrap_content"
           Android:layout_gravity="start"
           Android:text="@{viewModel.selectedItem.test2}" />
       <Space
           Android:layout_width="wrap_content"
           Android:layout_height="match_parent"
           Android:layout_weight="1" />
   </LinearLayout>

   <LinearLayout
       Android:layout_width="match_parent"
       Android:layout_height="wrap_content"
       Android:orientation="horizontal"
       >
       <Space
           Android:layout_width="wrap_content"
           Android:layout_height="match_parent"
           Android:layout_weight="1" />
       <TextView
           Android:layout_width="wrap_content"
           Android:layout_height="wrap_content"
           Android:text="Nummer" />
       <Space
           Android:layout_width="wrap_content"
           Android:layout_height="match_parent"
           Android:layout_weight="1" />
       <TextView
           Android:layout_width="wrap_content"
           Android:layout_height="wrap_content"
           Android:layout_gravity="start"
           Android:text="@{viewModel.selectedItem.test}" />
       <Space
           Android:layout_width="wrap_content"
           Android:layout_height="match_parent"
           Android:layout_weight="1" />
   </LinearLayout>
</GridLayout>
0
Dh poker

Je voulais avoir un tableau centré avec les étiquettes alignées à droite et les valeurs alignées à gauche. L'espace supplémentaire devrait être autour de la table. Après avoir beaucoup expérimenté et ne pas suivre ce que la documentation m'a dit de faire, j'ai trouvé quelque chose qui fonctionne. Voici ce que j'ai fait:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:orientation="vertical" >

<GridLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:columnCount="2"
    Android:orientation="horizontal"
    Android:useDefaultMargins="true" >

    <TextView
        Android:layout_gravity="right"
        Android:text="Short label:" />

    <TextView
        Android:id="@+id/start_time"
        Android:layout_gravity="left"
        Android:text="Long extended value" />

    <TextView
        Android:layout_gravity="right"
        Android:text="A very long extended label:" />

    <TextView
        Android:id="@+id/elapsed_time"
        Android:layout_gravity="left"
        Android:text="Short value" />
</GridLayout>

Cela semble fonctionner mais GridLayout affiche le message:

"Cette mise en page GridLayout ou son parent LinearLayout est inutile"

Je ne sais pas pourquoi c'est "inutile" quand ça marche pour moi.

Je ne sais pas pourquoi cela fonctionne ou s'il s'agit d'une bonne idée, mais si vous l'essayez et pouvez fournir une meilleure idée, une petite amélioration ou expliquer pourquoi cela fonctionne (ou ne fonctionnera pas), j'apprécierais vos commentaires.

Merci.

0
Mitch