web-dev-qa-db-fra.com

Comment définir layout_gravity par programme?

Ma question est simple

Comment définir mes boutons layout_gravity par programme?

J'ai trouvé ceci sur Internet, mais cela me jette 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?

297
Adam Varhegyi

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 définir le contrôle de gravité Gravity .

Fondamentalement, vous devriez choisir le LayoutParams en fonction du parent. Cela peut être RelativeLayout, LinearLayout etc ...

500
Karthi

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

Voici le long morceau, si la réponse ne vous intéresse que s'il vous plaît faites défiler jusqu'au code:

Android: Gravity et Android: layout_gravity fonctionne différemment. Ici c'est un article que j'ai lu qui m'a aidé.

Résumé de l'article: la gravité affecte la vue après l'attribution de la hauteur/largeur. Ainsi, le centre de gravité n’affectera pas la vue réalisée FILL_PARENT (considérez-la comme une marge automatique). layout_gravity center affectera la vue qui est FILL_PARENT (considérez-la comme un pad automatique).

Fondamentalement, Android: layout_gravity NE PEUT PAS être accessible par programmation, seul Android: gravité. Dans le cas du PO 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 indique "Aucune méthode associée", ce qui signifie qu'il est impossible d'accéder par programme. Considérant que la gravité est un domaine dans la classe.

51
Uknight
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 dans la vue.

23
Yashwanth Kumar

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

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

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

Si vous voulez changer le layou_gravity d'une vue existante, procédez comme suit:

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

N'oubliez pas d'utiliser la bonne LayoutParams selon le type de disposition dans lequel se trouve votre vue. Ex:

LinearLayout.LayoutParams
11
vovahost
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

utilisez-le pour ajouter plus d'une gravité

9
Omar Alnajjar

Cette question est ancienne mais je viens d'avoir le même problème et résolu comme ça

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

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 met ma textView au centre de la mise en page. Donc, SetGravity propriété de mise en page fait référence à la mise en page conten

4
alin0509

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()
4
Hitesh Sahu

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 haute pour organiser la vue au centre. Je fais bien la section de code.

3
Cheng

Le reste des réponses est correct, je veux ajouter plus d'explications. Layout_gravity explique 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 null est qu'il n'appelle pas addView avant getLayoutParams ().

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

3
Snow Albert

Si vous devez définir Gravity pour une vue, utilisez les options suivantes:

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

Pour définir layout_gravity pour le bouton, utilisez le champ de gravité pour les layoutparams comme

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

essayez cet espoir cela efface merci

3
user2779311

Parfaitement travaillé !!! Aucune des réponses ci-dessus ne fonctionne pour moi. Dans les fichiers XML, le paramètre gravity et le paramètre 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 une explication claire sur la gravité et la mise en page.

2
Tara

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

2
michael wang

Je suis passé de LinearLayout.LayoutParams à RelativeLayout.LayoutParams pour obtenir enfin le résultat que je souhaitais 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);
0
user3886197
 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);
0
Manthan Patel

Essayez ce code

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

ou

    btn.setGravity(Gravity.TOP);
0

La plupart des réponses ci-dessus sont exactes; écrivez donc une méthode d'assistance, afin que vous puissiez l'utiliser directement dans votre projet.

set layout_gravity par programmation

_// 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;
    }
_
0
Abhishek Garg