¿Cómo configurar layout_gravity mediante programación?

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?

preguntado el 08 de noviembre de 11 a las 11:11

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

20 Respuestas

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 el control de gravedad Gravedad.

Básicamente, debes elegir el LayoutParams dependiendo de los padres. Puede ser RelativeLayout, LinearLayout etc ...

Respondido el 30 de junio de 19 a las 02:06

Por algunas razones, params.gravity = 80 (debería estar en la PARTE INFERIOR, 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

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

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

@usman no, se trata de layout_gravity (es decir LayoutParams.gravity). La gravity sería button.setGravity() - Floern

Hay mucha información incorrecta sobre la gravedad y el layout_gravity aquí en SO. Muchas personas piensan que setGravity() es layout_gravity, pero esto es incorrecto. Puedo aprobar que esta respuesta sea correcta para configurar layout_gravity mediante programación. - antes

Odiaría estar resucitando hilos viejos, 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 funcionan de manera diferente. AquíEs un artículo que leí que me ayudó.

GIST del artículo: la gravedad afecta la vista después de que se asigna la altura / ancho. Entonces, el centro de gravedad no afectará una vista que se haga FILL_PARENT (piense en ello como un margen automático). layout_gravity center AFECTARÁ la vista que es FILL_PARENT (piense en ello como almohadilla automática).

Básicamente, NO SE PUEDE acceder a android: layout_gravity mediante programación, solo a 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 mediante programación. Considerando que la gravedad es un campo en la clase.

Respondido el 17 de junio de 16 a las 16:06

También para agregar esos márgenes automáticos de gravedad (a falta de un término mejor) basados ​​en la orientación del padre LinearLayout. El enlace del artículo proporcionado le ayudará. - Uknight

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 los botones. DESPUÉS DE el botón se agregó a un padre (GridLayout), de lo contrario la gravedad sería ignorada.

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

Respondido 27 Jul 13, 09:07

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

¡Sigue siendo cierto en 2020! ¿Por qué? - Thomas

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.

Respondido 06 ago 12, 15:08

Es solo gravedad, no layout_gravity. - Adam Varhegyi

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

Publicar un documento enorme 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

Si desea cambiar el layou_gravity de una vista existente haga esto:

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

Recuerde usar el derecho LayoutParams según el tipo de diseño en el que se encuentra la vista. Por ejemplo:

LinearLayout.LayoutParams

contestado el 30 de mayo de 15 a las 12:05

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

use esto para agregar más de una gravedad

contestado el 16 de mayo de 17 a las 19:05

No, así es como: gravity = Gravity.END or Gravity.BOTTOM - Oleksandr Nos

@OleksandrNos Lo que escribiste es la sintaxis de Kotlin, lo que escribió Omar es la sintaxis de Java. - Tamim Attafi

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

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

Respondido el 11 de junio de 12 a las 18:06

@Muzikant .. ok .. no me di cuenta primero .. pero ahora está claro para mí .. Gracias - Ningún hombre

¿Esto solo funciona especificando qué tipo de diseño es primero? Como RelativeLayout.LayoutParams ... en lugar de solo LayoutParams - shecodesthings

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

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

respondido 01 mar '19, 12:03

Me ahorra tiempo ... THX - BertKing

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

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

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

SetGravity pone mi textView en el centro del diseño. Entonces SetGravity propiedad de diseño se refiere a diseño contenido

Respondido el 05 de Septiembre de 14 a las 11:09

En caso de que necesite configurar la gravedad para una vista, utilice 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 layoutparams como

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

prueba esto espero que esto se aclare gracias

Respondido el 06 de Septiembre de 14 a las 17:09

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 la vista en el centro del padre. Por lo tanto, 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.

Respondido 26 ago 18, 19:08

i - cursiva)))) - Artem

El resto de las respuestas son correctas, quiero agregar más explicaciones. El 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 llama a addView antes de getLayoutParams ().

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

Respondido el 16 de diciembre de 15 a las 20:12

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

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

Respondido 21 Jul 16, 15:07

¡¡¡Funcionando perfectamente !!! Ninguna de las respuestas anteriores funciona para mí. En el archivo Xml, la configuración de la gravedad y la configuración de 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 verifica Aquí, donde puede encontrar una explicación clara sobre la gravedad y layout_gravity.

Respondido 11 Jul 17, 10:07

La mayoría de las respuestas anteriores son correctas, por lo que se escribe un métodos de ayuda, para que pueda usarlo directamente en su proyecto.

planificadas layout_gravity programá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;
    }

Respondido 29 ago 19, 15:08

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

Pero en lugar de la gravedad usas addRule

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams (altura del círculo, altura del círculo);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

Respondido el 25 de junio de 15 a las 23:06

Prueba este código

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

or

    btn.setGravity(Gravity.TOP);

Respondido 07 Jul 17, 12:07

OP pide layout_gravity no gravitiy. - alizeyn

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

Respondido 28 ago 18, 12:08

Modifique los parámetros de diseño existentes y vuelva a establecer los parámetros de diseño

//Get the current layout params and update the Gravity
(iv.layoutParams as FrameLayout.LayoutParams).gravity = Gravity.START
//Set layout params again (this updates the view)
iv.layoutParams = layoutParams

Respondido 02 Feb 21, 09:02

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

Respondido 09 ago 19, 11:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.