¿Cómo configurar la gravedad de diseño programáticamente?


Mi pregunta es simple,

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

Encontré esto en Internet, pero simplemente me lanza una excepción de 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?

Author: brainless, 2011-11-08

16 answers

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;

button.setLayoutParams(params);

Para los valores de gravedad y cómo establecer la comprobación de gravedad Gravedad.

Y básicamente, debe elegir los LayoutParams dependiendo del padre. Puede ser RelativeLayout, LinearLayout etc...

 459
Author: Karthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-07 10:39:05

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

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 he leído que me ayudó.

ESENCIA del artículo: la gravedad afecta a la vista después de asignar altura / anchura. So centro de gravedad no afectará a una vista que se haga FILL_PARENT (piense en ello como margen automático). layout_gravity centre afectará a la vista que es FILL_PARENT (piense en ello como auto pad).

Básicamente, android:layout_gravity NO SE PUEDE acceder mediante programación, solo android:gravity. En el caso del OP y en el mío, 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 métodos relacionados " el significado no puede ser accedido programáticamente. Mientras que la gravedad es un campo en la clase.

 50
Author: Uknight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-17 13:15:59
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.

 22
Author: Yashwanth Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-06 11:58:55

Tuve un problema similar al establecer programáticamente layout_gravity en los botones de un GridLayout.

El truco era establecer la gravedad en el botón LayoutParams 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)
 16
Author: owjsub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-27 05:47:16

Esta pregunta es antigua, pero acabo de tener el mismo problema y lo resolvió así

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;
 8
Author: CodeFlakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-11 14:12:18
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

Use esto para agregar más de una gravedad

 8
Author: Omar Alnajjar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-16 16:56:58

Si desea cambiar el layou_gravity de una vista existente ello:

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

Recuerde usar el LayoutParams correcto basado en el tipo de diseño en el que se encuentra su vista. Ex:

LinearLayout.LayoutParams
 6
Author: vovahost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-30 09:13:21

Uso someting así: (Xamarin y código C#)

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

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

El setGravity pone mi TextView en el centro del diseño. So setGravity la propiedad layout se refiere a layout content

 4
Author: alin0509,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-05 07:45:00

En caso de que necesite establecer la gravedad para una vista, use lo siguiente

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

Para establecer layout_gravity para el Botón utilice 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

 3
Author: user2779311,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-06 13:56:25

El resto de las respuestas son correctas, quiero agregar más explicaciones. layout_gravity trata sobre cómo posicionar la vista en la vista padre.

Debe establecer gravity **después del método parentView.Se ha llamado a 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 se dijo " Este método puede devolver null si esta vista no está adjunta a un grupo de vista padre o {@link # setLayoutParams (android.vista.ViewGroup.LayoutParams)} no se ha invocado correctamente. Cuando se adjunta una vista a un grupo de vistas principal, este método no debe devolver null."

 3
Author: Snow Albert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-16 17:32:16

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

 2
Author: michael wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-21 12:16:21

¡Funciona Perfectamente!!! Ninguna de las respuestas anteriores funciona para mí. En el archivo Xml la configuración de gravity y layout_gravity es diferente. Echa un vistazo al 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 layout_gravity .

 2
Author: Tara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-11 07:19:11

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

Estas secciones de código hacen que LinearLayout ponga los primeros elementos de la vista en el centro del padre. Por lo tanto, el sistema no considera el ancho inicial y alto para organizar la vista en el centro . Hago bien la sección de código.

 2
Author: Cheng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-26 16:30:49

Cambié de LinearLayout.LayoutParams to RelativeLayout.LayoutParams para finalmente obtener el resultado que deseaba en un circleview personalizado que creé.

Pero en lugar de la gravedad se utiliza addRule

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

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);
 0
Author: user3886197,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-25 20:35:18

Pruebe este código

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

O

    btn.setGravity(Gravity.TOP);
 0
Author: Faxriddin Abdullayev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-07 09:38:38
 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
Author: Manthan Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 09:47:13