Je veux avoir une grille 2x2 avec des boutons à l'intérieur. Ce n'est qu'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 ligne. Cela provoque beaucoup d'espace supplémentaire à droite de mon GridLayout.
J'ai essayé de définir, layout_gravity="fill_horizontal"
mais cela ne s'applique qu'à la dernière vue de la ligne. Cela signifie que la cellule 1 s'étire complètement pour donner suffisamment d'espace pour la cellule 0.
Réflexions sur la façon de résoudre ce problème?
Réponses:
MISE À JOUR : Les poids sont pris en charge à partir de l'API 21. Voir la réponse de PaulT pour plus de détails. FIN DE MISE À JOUR Il existe des limitations lors de l'utilisation de GridLayout, la citation suivante est tirée de la documentation .
Voici un petit exemple qui utilise des sous-vues LinearLayout. (J'ai utilisé des vues d'espace qui occupent la zone inutilisée et poussent les boutons dans la position souhaitée.)
la source
À partir de l'API 21, la notion de poids a été ajoutée à GridLayout. Pour prendre en charge les appareils Android plus anciens, vous pouvez utiliser GridLayout à partir de la bibliothèque de support v7.
Le code XML suivant donne un exemple de la façon dont vous pouvez utiliser des poids pour remplir la largeur de l'écran.
la source
FrameLayout
qui contenait uneButton and an
ImageView` (afin d'avoir une icône superposée sur un bouton qui montrait un retour visuel lorsqu'il était touché ... longue histoire) dans le cadre d'un clavier. Le cadrecolumnWeight
etgravity
tous les autresButton
ont bien fonctionné, mais se sont cassés leFrameLayout
. Le laisser juste pour leFrameLayout
fait que tout soit disposé de la même manière que prévu.Appcompat21 GridLayout a les poids des colonnes et des lignes 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.
la source
compile "com.android.support:gridlayout-v7:$supportVersion"
app:columnCount="2"
):xmlns:app="http://schemas.android.com/apk/lib/android.support.v7.widget.GridLayout"
Démarrage dans API 21 sans bibliothèque de support v7 avec ScrollView:
XML:
la source
Vous pouvez définir dynamiquement la largeur de chaque enfant:
la source
useDefaultMargins="true"
- fonctionne parfaitement avec euxfalse
Essayez d'ajouter ce qui suit à votre spécification GridLayout. Cela devrait fonctionner.
la source
C'est la bonne réponse
la source
J'ai enfin trouvé la solution. Comme l'a dit Rotemmiz, vous devez le faire dynamiquement par la suite. Ce code étire les boutons pour remplir la vue horizontalement, mais la même chose peut être effectuée verticalement.
(Le 20 est pour le rembourrage et les marges internes et externes. Cela pourrait être fait plus universellement, mais c'est beaucoup plus propre)
Ensuite, il peut être appelé comme ceci:
Cela doit être fait avec un observateur car nous devons attendre que la vue soit dessinée avant d'appeler les vues.
la source
Dans mon cas, j'ajoutais les boutons de manière dynamique, donc ma solution nécessitait une partie XML et une partie Java. J'ai dû trouver et mélanger des solutions à partir de quelques endroits différents et j'ai pensé les 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 ...
grid:useDefaultMargins="true"
n'est pas requis mais j'ai ajouté parce que cela me semblait mieux, vous pouvez appliquer d'autres effets visuels (par exemple un rembourrage) comme mentionné dans certaines réponses ici. Maintenant, pour les boutons, je dois les ajouter dynamiquement. Voici la partie Java de mon code pour réaliser ces boutons, j'inclus uniquement les lignes liées à ce contexte. Supposons que je dois créer des boutons à partir du nombre de boutonsmyOptions
disponibles pour mon code et que je ne copie pas également le code OnClickListener.Comme nous utilisons GridLayout à partir de la bibliothèque de support et non le GridLayout standard, nous devons en informer Grade dans le
YourProject.grade
fichier.la source
Vous pouvez accélérer ce processus en remplaçant la méthode ViewGroup onLayout. Voici ma solution universelle:
EDIT: N'oubliez pas match_parent pour les enfants!
la source
getChildAt(i).layout(viewWidth * columnIndex + margin, viewHeight * rowIndex + margin, viewWidth * columnIndex + viewWidth - margin, viewHeight * rowIndex + viewHeight - margin);
La meilleure solution que j'ai pu trouver est d'utiliser une disposition linéaire (horizontale) pour chaque ligne que vous souhaitez et à l'intérieur, attribuez la largeur du bouton (cellule) à 0dp et le poids à 1. Pour chacune des dispositions linéaires (lignes), affectez la hauteur à 0dp et le poids à 1. Trouvez le code ci-dessous - également android: layout_gravity = "center_vertical" est utilisé pour aligner les boutons dans une rangée au cas où ils contiennent du texte de longueur variable. L'utilisation de 0dp et son poids sont une astuce assez soignée mais pas si connue.
la source
Vous voilà :
la source
Je voulais avoir une table centrée avec les étiquettes alignées à droite et les valeurs alignées à gauche. L'espace supplémentaire doit être autour de la table. Après de nombreuses expérimentations et sans suivre ce que la documentation disait que je devais faire, j'ai trouvé quelque chose qui fonctionne. Voici ce que j'ai fait:
Cela semble fonctionner mais le GridLayout affiche le message:
"Cette disposition 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 si c'est 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 les commentaires.
Merci.
la source
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. Le 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 conservant la couleur de la cellule.
la source
Vieille 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.
la source
Je souhaite que cela aide quelqu'un
Résultat
Code:
la source
Résultat :
Essayez quelque chose comme ceci:
Si vous souhaitez une largeur et une hauteur spécifiques pour vos cellules, utilisez:
la source
Ceci est le code pour une application plus par défaut sans les boutons, c'est très pratique pour moi
la source
j'ai le même problème et je pense juste définir la largeur et la hauteur par programme:
définir la largeur du bouton avec les mesures metrics.widthPixels / 2 est un objet de DisplayMetrics.
la source
vous pouvez trouver l'intégralité des didacticiels ici, disposition de la grille Android avec CardView et OnItemClickListener
la source
Voici ce que j'ai fait et je suis heureux de dire que cela a fonctionné pour moi. Moi aussi, je voulais une grille d'éléments 2x2, 3x3 etc. pour couvrir tout l'écran. Les grilles ne respectent pas la largeur de l'écran. LinearLayouts fonctionne, mais vous ne pouvez pas utiliser de poids imbriqués.
La meilleure option pour moi était d'utiliser des fragments. J'ai utilisé ce tutoriel pour commencer avec ce que je voulais faire.
Voici du code:
Activité principale:
Activity_main_6 XML (gonfle 3 fragments)
Disposition des fragments de base
Classe de fragment (gère uniquement l'initialisation d'une vue personnalisée) gonfle 2 tuiles par fragment
}
C'est tout!
C'est un travail étrange autour de l'utilisation de poids imbriqués, essentiellement. Cela me donne une grille 2x3 parfaite qui remplit tout l'écran de ma tablette 10 pouces et de mon ADN HTC droid. Faites-moi savoir comment ça se passe pour vous!
la source