378 votes

Comment définir le paramètre layout_gravity de manière programmatique ?

Ma question est simple,

Comment configurer mes boutons layout_gravity de manière programmatique ?

J'ai trouvé cela sur Internet, mais cela me fait simplement tomber dans une exception Nullpointer :

 Button MyButton = new Button(this);

    LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
    lllp.gravity=Gravity.RIGHT;
    MyButton.setLayoutParams(lllp); 

    MyLinearLayout.addView(MyButton);

Une solution ?

0 votes

Je crois que vous devez ajouter la vue à son parent pour qu'elle ait des LayoutParams qui ne soient pas nuls.

599voto

Karthi Points 3654

Java

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;

button.setLayoutParams(params);

Kotlin

val params = LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
    weight = 1.0f
    gravity = Gravity.TOP
}

Pour les valeurs de gravité et comment régler la gravité, vérifiez Gravité .

En gros, vous devez choisir le LayoutParams en fonction du parent. Il peut être RelativeLayout , LinearLayout etc...

1 votes

Pour certaines raisons, params.gravity = 80 (qui devrait être BOTTOM, selon la documentation) ne fonctionne pas. J'ai un peu d'espace entre le bas de la vue et le texte. Il n'est pas vraiment aligné sur le bas...

0 votes

@AdamVarhegyi Sans voir votre layout xml, je ne suis pas certain de ce qui reste de votre problème. Mais l'espace dont vous parlez est peut-être dû au remplissage. Essayez de setPadding() sur votre View à 0 pour le fond.

52 votes

Prendre la valeur constante de la documentation est tout simplement erroné, veuillez utiliser Gravity.TOP

58voto

Uknight Points 193

Je ne voudrais pas ressusciter de vieux fils de discussion, mais il s'agit d'un problème auquel on ne répond pas correctement et, de plus, j'ai moi-même rencontré ce problème.

Voici la partie longue, si vous n'êtes intéressé que par la réponse, veuillez faire défiler la page jusqu'au code :

Android:gravity et Android:layout_gravity fonctionnent différemment. Aquí J'ai lu un article qui m'a aidé.

GIST de l'article : la gravité affecte la vue après l'attribution de la hauteur/largeur. Ainsi, le centre de gravité n'affectera pas une vue qui est faite FILL_PARENT (pensez-y comme une marge automatique). layout_gravity centre affectera la vue qui est faite FILL_PARENT (pensez-y comme une marge automatique).

Fondamentalement, Android:layout_gravity NE PEUT PAS être accessible par programmation, mais uniquement Android:gravity. Dans le cas de l'OP et dans le mien, la réponse acceptée ne place pas le bouton verticalement au centre.

Pour améliorer la réponse de Karthi :

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);

Lien a LinearLayout.LayoutParams .

Android:layout_gravity affiche "No related methods", ce qui signifie qu'il est impossible d'y accéder par programmation. Alors que gravity est un champ de la classe.

0 votes

Il faut également ajouter que la gravité s'auto-marginalise (faute d'un meilleur terme) en fonction de l'orientation du parent LinearLayout. Le lien de l'article fourni vous aidera.

22voto

owjsub Points 31

J'ai eu un problème similaire avec le réglage programmatique de layout_gravity sur les boutons dans un GridLayout.

L'astuce consistait à définir la gravité sur le bouton layoutParams APRÈS le bouton a été ajouté à un parent (GridLayout), sinon la gravité serait ignorée .

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)

0 votes

Comment changer le layout_gravity pour l'ensemble du GridLayout ?

0 votes

Toujours vrai en 2020 ! Pourquoi ?

20voto

Yashwanth Kumar Points 12122
MyButton.setGravity(Gravity.RIGHT);

Pour layout_gravity, utilisez la réponse indiquée par "karthi". Cette méthode définit la gravité pour placer les enfants à l'intérieur de la vue.

42 votes

C'est juste la gravité, pas le layout_gravity.

0 votes

Ok alors dites-moi si layout_gravity est égal à setGravity, alors comment je règle la gravité ?

0 votes

10voto

CodeFlakes Points 1012

Cette question est ancienne mais je viens d'avoir le même problème et je l'ai résolu de la manière suivante

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;

0 votes

@Muzikant ok je n'avais pas remarqué en premier mais maintenant c'est clair pour moi Merci

0 votes

Est-ce que cela ne fonctionne qu'en spécifiant d'abord le type de mise en page ? Comme RelativeLayout.LayoutParams ... au lieu de simplement LayoutParams.

0 votes

RelativeLayout.LayoutParams utilisent d'autres drapeaux pour définir la gravité de la vue (rightOf, centerInParent, centerVertical). Cette solution de contournement est pour les enfants LinearLayouts

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