¿Cómo puedo establecer el valor del atributo layout_weightpara el botón en Android dinámicamente desde el código de Java?
¿Cómo puedo establecer el valor del atributo layout_weightpara el botón en Android dinámicamente desde el código de Java?
Respuestas:
Puede pasarlo como parte del LinearLayout.LayoutParamsconstructor:
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.
param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
1fsi no hay decimales
Relative
Uso 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!
FILL_PARENTha quedado en desuso y MATCH_PARENTdebería usarse en su lugar.
MATCH_PARENTpuede usarse en lugar de FILL_PARENTincluso en dispositivos más antiguos.
FILL_PARENTvs MATCH_PARENT.
Si ya define su vista en su archivo de diseño (xml), solo desea cambiar el peso mediante programación, de esta manera es mejor
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);
Un nuevo LayoutParams sobrescribe otros parámetros definidos en su archivo xml como márgenes, o debe especificarlos en LayoutParams.
Si el constructor con ancho, alto y peso no funciona, intente usar el constructor con ancho y alto. Y luego establezca manualmente el peso.
Y si desea establecer el ancho de acuerdo con el peso, establezca el ancho como 0 en el constructor. Lo mismo se 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);
childParam2.weight = 0.7f;
child2.setLayoutParams(childParam2);
parent.setWeightSum(1f);
parent.addView(child1);
parent.addView(child2);
Si alguien busca respuesta, use 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 Diseño lineal.
layout_weightya se ha establecido, debe llamar View.requestLayout()para actualizar.
Cualquiera de LinearLayout.LayoutParamsy TableLayout.LayoutParamsfuncionó para mí, para los botones es el correcto TableRow.LayoutParams. Es decir:
TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
TableRow.LayoutParams.MATCH_PARENT,
TableRow.LayoutParams.WRAP_CONTENT, 1f);
Sobre usar MATCH_PARENTo WRAP_CONTENTser el mismo.
FILL_PARENTha quedado en desuso y MATCH_PARENTdebería usarse en su lugar.
LayoutParamspadre directo. Supongo que tuvo un accidente al intentar usar LinearLayout.LayoutParamssin el padre LinearLayout.
Si ya ha definido su vista en el archivo de diseño (xml) y solo desea cambiar el peso de forma programática, entonces crear nuevos LayoutParams sobrescribe otros parámetros definidos en su archivo xml.
Entonces, primero debes usar "getLayoutParams" y luego setLayoutParams
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams();
params.weight = 4f;
mButton.setLayoutParams(params);
Si layoutparamsya está definido (en XML o dinámicamente), aquí hay una línea:
((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)
}
}