Comment définir layout_gravity par programme?

334

Ma question est simple,

Comment définir mes boutons layout_gravity par programmation?

J'ai trouvé cela sur Internet, mais cela me lève simplement 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);

Toute solution?

Adam Varhegyi
la source
Je pense que vous devez ajouter la vue à son parent avant qu'il ne dispose de LayoutParams qui ne sont pas nuls.
Rich Morey

Réponses:

545

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 la gravité .

Fondamentalement, vous devez choisir le LayoutParamsselon le parent. Ça peut être RelativeLayout, LinearLayoutetc ...

Karthi
la source
1
Pour certaines raisons, params.gravity = 80 (Cela devrait être BAS, par te Docs) ne fonctionne tout simplement pas. J'ai un peu d'espace entre le bas de la vue et le texte. Ce n'est pas si aligné en bas ...
Adam Varhegyi
51
Prendre la valeur constante de la documentation est tout simplement faux, veuillez utiliser Gravity.TOP
Maragues
36
c'est "gravité" et il a demandé "layout_gravity" ??
M. Usman Khan
11
@usman non, c'est à propos layout_gravity(c'est-à-dire LayoutParams.gravity). Ce gravityseraitbutton.setGravity()
Floern
9
Il y a beaucoup d'informations erronées sur la gravité et la disposition_gravité ici sur SO. Beaucoup de gens pensent que setGravity()c'est le layout_gravity, mais c'est faux. Je peux approuver que cette réponse est correcte pour définir la configuration de layout_gravity par programme.
Bevor
55

Je détesterais ressusciter d'anciens threads mais c'est un problème auquel on ne répond pas correctement et en plus j'ai rencontré ce problème moi-même.

Voici le long morceau, si vous êtes uniquement intéressé par la réponse, faites défiler jusqu'au code:

android: gravity et android: layout_gravity fonctionne différemment. Voici un article que j'ai lu qui m'a aidé.

GIST de l'article: la gravité affecte la vue une fois la hauteur / largeur affectée. Le centre de gravité n'affectera donc pas une vue effectuée FILL_PARENT (pensez-y comme marge automatique). Le centre de layout_gravity affectera la vue qui est FILL_PARENT (pensez-y comme pad automatique).

Fondamentalement, android: layout_gravity NE PEUT PAS être accessible par programme, uniquement android: gravity. Dans le cas de l'OP et dans mon cas, 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 vers LinearLayout.LayoutParams.

android: layout_gravity affiche "Aucune méthode associée", ce qui ne peut pas être consulté par programmation. Alors que la gravité est un domaine de la classe.

Uknight
la source
Pour ajouter également que les marges automatiques de gravité (faute d'un meilleur terme) basées sur l'orientation du parent LinearLayout. Le lien d'article fourni vous aidera.
Uknight
21
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.

Yashwanth Kumar
la source
37
C'est juste la gravité, pas la disposition_gravité.
Adam Varhegyi
Bon alors dites-moi si layout_gravity est égal à setGravity, alors comment je règle la gravité?
Adam Varhegyi
developer.android.com/reference/android/widget/… , regardez ça ..
Yashwanth Kumar
5
Poster un énorme document n'est pas une solution désolé,
Adam Varhegyi
recherchez la méthode setGravity dans le lien .., en quelque sorte la redirection vers la méthode exacte ne fonctionne pas ..
Yashwanth Kumar
17

J'ai eu un problème similaire avec la définition par programme de layout_gravity sur les boutons d'un GridLayout.

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

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)
owjsub
la source
Comment puis-je changer la disposition_gravité pour l'ensemble du GridLayout?
Iqbal
15

Si vous souhaitez modifier la layou_gravityvue existante, procédez comme suit:

((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;

N'oubliez pas d'utiliser le droit en LayoutParamsfonction du type de mise en page dans lequel se trouve votre vue. Ex:

LinearLayout.LayoutParams
vovahost
la source
12
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

utiliser cela pour ajouter plus d'une gravité

Omar Alnajjar
la source
9

Cette question est ancienne mais j'ai juste eu le même problème et l'ai résolu comme ça

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;
CodeFlakes
la source
@Muzikant .. ok .. je ne l'ai pas remarqué en premier .. mais maintenant c'est clair pour moi..Merci
Noman
Cela ne fonctionne-t-il qu'en spécifiant de quel type de mise en page il s'agit en premier? Comme RelativeLayout.LayoutParams ... au lieu de simplement LayoutParams
ryvianstyron
RelativeLayout.LayoutParams utilise d'autres indicateurs pour définir la gravité de la vue (rightOf, centerInParent, centerVertical). Cette solution de contournement est pour les enfants LinearLayouts
noni
6

KOTLIN définissant plus d'une gravité sur FrameLayout sans changer de taille:

     // assign more than one gravity,Using the operator "or"
    var gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL
     // update gravity
    (pagerContainer.layoutParams as FrameLayout.LayoutParams).gravity = gravity
     // refresh layout
     pagerContainer.requestLayout()
Hitesh Sahu
la source
C'est gagner mon temps ... THX
BertKing
4

J'utilise quelque chose comme ça: (Xamarin et code C #)

  LinearLayout linLayout= new LinearLayout(this); 
    linLayout.SetGravity(GravityFlags.Center);

    TextView txtView= new TextView(this);  
     linLayout.AddView(txtView); 

SetGravity place mon textView au centre de la mise en page. La propriété de mise en page SetGravity fait donc référence au contenu de la mise en page

alin0509
la source
4

Si vous devez définir la gravité pour une vue, utilisez les éléments suivants

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);

Pour définir la gravité de la disposition pour le bouton, utilisez le champ de gravité pour les paramètres de disposition comme

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;

essayez cet espoir cela efface merci

user2779311
la source
3

Les autres réponses sont correctes, je veux ajouter plus d'explications. La disposition_gravité indique comment positionner la vue dans la vue parent.

Vous devez définir la gravité ** après l'appel de la méthode parentView.addView () **. Nous pouvons voir le code:

public void setLayoutParams(ViewGroup.LayoutParams params) {
    if (params == null) {
        throw new NullPointerException("Layout parameters cannot be null");
    }
    mLayoutParams = params;
    resolveLayoutParams();
    if (mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).onSetLayoutParams(this, params);
    }
    requestLayout();
}

Et le problème du pointeur nul est qu'il n'appelle pas addView avant getLayoutParams ().

L'annotation a déjà été dite "Cette méthode peut retourner null si cette vue n'est pas attachée à un ViewGroup parent ou {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} n'a pas été invoquée avec succès. Lorsqu'une vue est attachée à un parent ViewGroup, cette méthode ne doit pas retourner null. "

Snow Albert
la source
Cela m'a aussi mordu ... il n'est pas évident que vous devez définir la gravité après l'appel de addView (). Vous penseriez que vous auriez tout mis en place sur la nouvelle vue, puis l'ajoutez donc ce n'est pas intuitif :-P
kenyee
3

Si vous voulez mettre une vue au centre du parent, vous pouvez le faire avec le code suivant.

public class myLayout extends LinearLayout {

    public myLayout(Context context) {
      super(context);

      RelativeLayout vi = (RelativeLayout) ((LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.activity_main, null);
      LinearLayout.LayoutParams cc = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      cc.gravity = Gravity.CENTER;
      this.setGravity(Gravity.CENTER);
      this.addView(vi);
  }
}

ces sections de code font que LinearLayout place les premiers éléments de vue au centre du parent. Donc, nous ne considérons pas la largeur initiale et la hauteur pour organiser la vue au centre. Je fais bien la section de code.

Cheng
la source
i - italique))))
Artem
2

à RelativeLayout, essayez ce code, cela fonctionne pour moi: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

Michael Wang
la source
2

Fonctionne parfaitement !!! Aucune des réponses ci-dessus ne fonctionne pour moi. Dans le fichier Xml, le réglage de la gravité et celui de la disposition layout_gravity sont différents. Découvrez le code ci-dessous

// here messageLL is the linear layout in the xml file
// Before adding any view just remove all views
   messageLL.removeAllViews();
// FrameLayout is the parent for LinearLayout
FrameLayout.LayoutParams params = new 
   FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
   params.gravity = Gravity.CENTER|Gravity.CENTER_VERTICAL;
   messageLL.setLayoutParams(params);
   messageText.setVisibility(View.GONE);
   messageNoText.setVisibility(View.VISIBLE);
   messageLL.addView(messageNoText);

Vérifiez également ceci, où vous pouvez trouver des explications claires sur la gravité et la disposition_gravité.

Tara
la source
1

La plupart des réponses ci-dessus sont exactes, alors écrivez des méthodes d'assistance, afin que vous puissiez les utiliser directement dans votre projet.

définir par layout_gravityprogramme

// gravity types : Gravity.BOTTOM, Gravity.START etc.
// view : can be any view example : button, textview, linearlayout, image etc.

// for single view
   public static void setLayoutGravity(int gravity, View view){
     ((LinearLayout.LayoutParams) view.getLayoutParams()).gravity = gravity;
    }


// for mulitple views
  public static void setLayoutGravity(int gravity, View ...view){
        for(View item : view)
            ((LinearLayout.LayoutParams) item.getLayoutParams()).gravity = gravity;
    }
Abhishek Garg
la source
0

Je suis passé de LinearLayout.LayoutParams à RelativeLayout.LayoutParams pour enfin obtenir le résultat que je désirais sur un circuit personnalisé que j'ai créé.

Mais au lieu de la gravité, vous utilisez addRule

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams (circleheight, circleheight);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);
user3886197
la source
0

Essayez ce code

    Button btn = new Button(YourActivity.this);
    btn.setGravity(Gravity.CENTER | Gravity.TOP);
    btn.setText("some text");

ou

    btn.setGravity(Gravity.TOP);
Faxriddin Abdullayev
la source
3
OP demande layout_gravitynon gravitiy.
Ali Zeynali
0
 int width=getResources().getDisplayMetrics().widthPixels; 
 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (width, width);

            params.gravity = Gravity.CENTER;

           iv_main_text = new HTextView(getContext());
            iv_main_text.setLayoutParams(params);
            iv_main_text.setBackgroundColor(Color.BLUE);
            iv_main_text.setTextSize(60);
            iv_main_text.setGravity(Gravity.CENTER);
            iv_main_text.setTextColor(Color.BLACK);
Manthan Patel
la source
-1
FloatingActionButton sendFab = new FloatingActionButton(this);
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.setMargins(32, 32, 32, 32);
    layoutParams.gravity = Gravity.END|Gravity.BOTTOM;
    sendFab.setLayoutParams(layoutParams);
    sendFab.setImageResource(android.R.drawable.ic_menu_send);
VIVEK CHOUDHARY
la source