¿Cómo establecer el atributo layout_weight dinámicamente desde el código?

¿Cómo puedo establecer el valor para el atributo layout_weight para el botón en Android dinámicamente desde el código de Java?

Puede pasarlo como parte del constructor LinearLayout.LayoutParams :

 LinearLayout.LayoutParams param = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1.0f ); YOUR_VIEW.setLayoutParams(param); 

El último parámetro es el peso.

Use LinearLayout.LayoutParams :

 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); params.weight = 1.0f; Button button = new Button(this); button.setLayoutParams(params); 

EDITAR: ¡Ah, la respuesta de Erich es más fácil!

Si ya define su vista en su archivo de diseño (xml), solo quiere cambiar el peso programáticamente, de esta manera es mejor

 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 1.0f; mButton.setLayoutParams(params); 

new a LayoutParams sobrescribe otros parámetros definidos en su archivo xml como márgenes, o necesita especificarlos en LayoutParams.

Si el constructor con ancho, alto y peso no funciona, intente usar el constructor con ancho y alto. Y luego configure manualmente el peso.

Y si desea que el ancho se configure de acuerdo con el peso, establezca el ancho como 0 en el constructor. Lo mismo aplica para la altura. El siguiente código funciona para mí.

 LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT); childParam1.weight = 0.3f; child1.setLayoutParams(childParam1); LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT); childParam1.weight = 0.7f; child2.setLayoutParams(childParam2); parent.setWeightSum(1f); parent.addView(child1); parent.addView(child2); 

Si alguien busca una respuesta, usa esto:

 LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams(); lay.weight = 0.5; 

Si está inicializando su diseño desde un archivo xml, esto será mucho más conveniente que proporcionar nuevos parámetros de diseño para el Diseño lineal.

Cualquiera de LinearLayout.LayoutParams y TableLayout.LayoutParams funcionó para mí; para los botones, el correcto es TableRow.LayoutParams . Es decir:

  TableRow.LayoutParams buttonParams = new TableRow.LayoutParams( TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT, 1f); 

Acerca del uso de MATCH_PARENT o WRAP_CONTENT sea ​​el mismo.

Si ya ha definido su vista en el archivo de diseño (xml) y solo desea cambiar el peso pro gtwigticalmente, entonces la creación de nuevos LayoutParams sobrescribe otros parámetros definidos en su archivo xml.

Entonces primero debes usar “getLayoutParams” y luego establecerLayoutParams

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);

Si layoutparams ya está definido (en XML o dinámicamente), aquí hay un trazador de líneas:

 ((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1; 

Usando Kotlin puedes hacer algo como:

 import android.content.Context import android.support.v4.content.ContextCompat import android.support.v7.widget.CardView import android.widget.* import android.widget.LinearLayout class RespondTo : CardView { constructor(context: Context) : super(context) { init(context) } private fun init(context: Context) { val parent = LinearLayout(context) parent.apply { layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply { orientation = LinearLayout.HORIZONTAL addView(EditText(context).apply { id = generateViewId() layoutParams = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply { } }) addView(ImageButton(context).apply({ layoutParams = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f) background = null setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px)) id = generateViewId() layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT).apply { addRule(RelativeLayout.ALIGN_PARENT_RIGHT) // addRule(RelativeLayout.LEFT_OF, myImageButton.id) } })) } } this.addView(parent) } }