¿Cómo configurar layout_gravity mediante programación?


334

Mi pregunta es simple

¿Cómo configurar mis botones layout_gravity mediante programación?

Encontré esto en Internet, pero simplemente me arroja una excepción Nullpointer:

 Button MyButton = new Button(this);

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


    MyLinearLayout.addView(MyButton);

¿Alguna solución?


Creo que debe agregar la vista a su padre antes de que tenga LayoutParams que no sean nulos.
Rich Morey

Respuestas:


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
}

Para conocer los valores de gravedad y cómo configurar la gravedad, consulte Gravedad .

Básicamente, debe elegir LayoutParamsdependiendo del padre. Puede ser RelativeLayout, LinearLayoutetc.


1
Por alguna razón, params.gravity = 80 (debería estar ABAJO, por te Docs) simplemente no funciona. Tengo algo de espacio entre la parte inferior de la Vista y el Texto. No está tan alineado con la parte inferior ...
Adam Varhegyi

51
Tomar el valor constante de la documentación es simplemente incorrecto, utilice Gravity.TOP
Maragues

36
esto es "gravedad" y pidió "layout_gravity"?
M. Usman Khan

11
@usman no, esto se trata layout_gravity(eso es LayoutParams.gravity). El gravityseríabutton.setGravity()
Floern el

99
Hay mucha información incorrecta sobre la gravedad y la disposición_gravedad aquí en SO. Muchas personas piensan que setGravity()es el layout_gravity, pero esto está mal. Puedo aprobar que esta respuesta sea correcta para configurar layout_gravity mediante programación.
Bevor

55

Odiaría resucitar viejos hilos, pero este es un problema que no se responde correctamente y, además, me he encontrado con este problema.

Aquí está la parte larga, si solo está interesado en la respuesta, desplácese hasta el código:

android: gravity y android: layout_gravity funciona de manera diferente. Aquí hay un artículo que he leído que me ayudó.

GIST del artículo: la gravedad afecta la vista después de que se asigna la altura / anchura. Por lo tanto, el centro de gravedad no afectará una vista que se realiza FILL_PARENT (piense en ello como margen automático). layout_gravity center afectará la vista que es FILL_PARENT (piense en ello como auto pad).

Básicamente, android: layout_gravity NO PUEDE tener acceso mediante programación, solo android: gravity. En el caso del OP y en mi caso, la respuesta aceptada no coloca el botón verticalmente en el centro.

Para mejorar la respuesta de Karthi:

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

Enlace a LinearLayout.LayoutParams.

android: layout_gravity muestra "No hay métodos relacionados", lo que significa que no se puede acceder programáticamente. Mientras que la gravedad es un campo en la clase.


También para agregar márgenes automáticos de gravedad (a falta de un término mejor) basado en la orientación del padre LinearLayout. El enlace del artículo proporcionado será de ayuda.
Uknight

21
MyButton.setGravity(Gravity.RIGHT);

Para layout_gravity use la respuesta indicada por "karthi". Este método establece la gravedad para colocar a los niños dentro de la vista.


37
Es solo gravedad, no layout_gravity.
Adam Varhegyi

Bien, entonces dime si layout_gravity es igual a setGravity, ¿cómo configuro la gravedad?
Adam Varhegyi


55
Publicar un enorme documento no es una solución lo siento,
Adam Varhegyi

busque el método setGravity en el enlace ..., de alguna manera, la redirección al método exacto no funciona ...
Yashwanth Kumar

17

Tuve un problema similar con la configuración programática de layout_gravity en los botones en un GridLayout.

El truco consistía en establecer la gravedad en el diseño de botones Parámetros DESPUÉS de que el botón se añadiera a un elemento primario (GridLayout), de lo contrario , se ignoraría la gravedad .

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

¿Cómo cambio el layout_gravity para todo el GridLayout?
Iqbal

15

Si desea cambiar la layou_gravityvista de una vista existente, haga esto:

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

Recuerde usar el derecho LayoutParamsbasado en el tipo de diseño en el que se encuentra su vista. Ej:

LinearLayout.LayoutParams

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

use esto para agregar más de una gravedad


9

Esta pregunta es antigua pero tuve el mismo problema y lo resolví así

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

@Muzikant ... ok ... no me di cuenta primero ... pero ahora está claro para mí
Noman

¿Esto solo funciona al especificar qué tipo de diseño es primero? Como RelativeLayout.LayoutParams ... en lugar de solo LayoutParams
ryvianstyron

RelativeLayout.LayoutParams usa otras banderas para establecer la gravedad de la vista (rightOf, centerInParent, centerVertical). Esta solución es para niños de LinearLayouts
noni

6

KOTLIN configura más de una gravedad en FrameLayout sin cambiar el tamaño:

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

Es ahorrar mi tiempo ... THX
BertKing

4

Yo uso algo así: (Xamarin y código C #)

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

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

SetGravity coloca mi textView en el centro del diseño. Entonces, la propiedad de diseño SetGravity se refiere al contenido del diseño


4

En caso de que necesite configurar Gravity para una Vista, use lo siguiente

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

Para configurar layout_gravity para el Botón, use el campo de gravedad para los parámetros de diseño como

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

prueba esta esperanza esto se despeja gracias


3

El resto de las respuestas son correctas, quiero agregar más explicaciones. Layout_gravity trata sobre cómo colocar la vista en la vista principal.

Debe establecer la gravedad ** después de llamar al método parentView.addView () **. Podemos ver el código:

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

Y el problema del puntero nulo es porque no está llamando a addView antes de getLayoutParams ().

La anotación ya decía "Este método puede devolver un valor nulo si esta Vista no está adjunta a un ViewGroup primario o {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} no fue invocado con éxito. Cuando una Vista está adjunta a un padre ViewGroup, este método no debe devolver nulo ".


Esto también me mordió ... no es obvio que tenga que establecer la gravedad después de que se llame a addView (). Pensaría que configuraría todo en la nueva vista y luego lo agregaría para que esto no sea intuitivo
:-P

3

Si desea poner una vista en el centro del padre, puede hacerlo con el siguiente código.

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

Esta sección de código hace que LinearLayout coloque los primeros elementos de vista en el centro del elemento primario. Entonces, el sistema no considera el ancho inicial y el alto para organizar la vista en el centro. Hago bien la sección de código.


i - cursiva))))
Artem

2

a RelativeLayout, prueba este código, funciona para mí: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


2

Perfectamente trabajando !!! Ninguna de las respuestas anteriores funciona para mí. En la configuración del archivo Xml, la gravedad y la disposición layout_gravity son diferentes. Mira el siguiente código

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

También verifique Esto, donde puede encontrar una explicación clara sobre la gravedad y el diseño_gravedad.


1

La mayoría de las respuestas anteriores son correctas, por lo tanto, escriba un método auxiliar, para que pueda usarlo directamente en su proyecto.

establecer layout_gravityprogramáticamente

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

Cambié de LinearLayout.LayoutParams a RelativeLayout.LayoutParams para finalmente obtener el resultado que deseaba en una vista de círculo personalizada que creé.

Pero en lugar de la gravedad, usas addRule

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

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

0

Prueba este código

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

o

    btn.setGravity(Gravity.TOP);

3
OP pide layout_gravityno gravitiy.
Ali Zeynali 01 de

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.