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?
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>
À 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>
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"/>
...
...
...
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);
Démarrage dans API 21 sans bibliothèque de support v7 avec ScrollView:
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>
Essayez d’ajouter ce qui suit à vos spécifications GridLayout. Cela devrait fonctionner.
Android:useDefaultMargins="true"
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>
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'
}
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.
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"
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>
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);
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/
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>
Je souhaite que cela aide quelqu'un
Résultat
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>
Résultat :
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
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>
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.