¿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?

Adam Varhegyi
fuente
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.

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

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

Yashwanth Kumar
fuente
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)
owjsub
fuente
¿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
vovahost
fuente
12
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

use esto para agregar más de una gravedad

Omar Alnajjar
fuente
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;
CodeFlakes
fuente
@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()
Hitesh Sahu
fuente
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

alin0509
fuente
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

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

Albert de nieve
fuente
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.

Cheng
fuente
i - cursiva))))
Artem
2

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

michael wang
fuente
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.

Tara
fuente
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;
    }
Abhishek Garg
fuente
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);
usuario3886197
fuente
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);
Faxriddin Abdullayev
fuente
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);
Manthan Patel
fuente
-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
fuente