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?


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 ...


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.


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.


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


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)

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

12
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

utiliser cela pour ajouter plus d'une gravité


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;

@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()

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


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


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. "


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.


i - italique))))
Artem

2

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


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


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;
    }

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);

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);

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);

-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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.