Establecer el peso del diseño de un TextView mediante programación

214

Estoy tratando de crear dinámicamente TableRowobjetos y agregarlos a a TableLayout. Los TableRowobjetos tienen 2 elementos, a TextViewy a CheckBox. Los TextViewelementos deben tener su peso de diseño establecido en 1 para empujar los CheckBoxelementos hacia el extremo derecho.

No puedo encontrar documentación sobre cómo establecer mediante programación el peso del diseño de un TextViewelemento.

eugene
fuente

Respuestas:

355

Tienes que usar TableLayout.LayoutParamscon algo como esto:

TextView tv = new TextView(v.getContext());
tv.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));

El último parámetro es el peso.

Macarse
fuente
15
No mencioné esto antes, así que lo siento. Pero intenté esto antes de hacer mi pregunta. Hace que TextView desaparezca del diseño. Pero, en una nota positiva, descubrí que establecer la propiedad stretch_columns de TableLayout en 0 causa el efecto que estoy buscando (TextView's a la izquierda, CheckBoxes a la derecha). Gracias por la ayuda.
eugene
8
Si está importando un diseño XML y no lo está creando dinámicamente, puede TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f));
tomarlo
55
Para establecer el peso del diseño mediante programación, TableRow.LayoutParamsdebe usarse en lugar de TableLayout.LayoutParams. Ver la respuesta de @ Dorje.
Halil
importar android.widget.LinearLayout; importar android.widget.TableLayout;
Prakash
1
Tenga en cuenta que la mayoría de las personas usaría 0 como primer o segundo parámetro (dependiendo si es horizontal o vertical) y no WRAP_CONTENT ya que lo que están buscando es establecer el peso.
FlorianB
97

La respuesta es que debe usar TableRow.LayoutParams, no LinearLayout.LayoutParams o cualquier otro LayoutParams.

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

Los diferentes LayoutParams no son intercambiables y si usa el incorrecto, entonces parece que no sucede nada. El padre de la vista de texto es una fila de la tabla, por lo tanto:

http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html

Dorje
fuente
Esta respuesta me ayudó mucho ... TableLayout no funcionó para mí
sham.y
Aw hombre, me has ahorrado mucho tiempo. ¿Dónde se especifica? No encontré nada en la documentación sobre usted que no pueda intercambiarLayoutParams
Adrien Cadet
TableRow.LayoutParamshizo el trabajo para mí también
Menelaos Kotsollaris
66
La parte clave de esta respuesta es el 0
Leon
Reducirá mi tiempo de trabajo. Estoy buscando esto por mucho tiempo. Muy buena solución
SIVAKUMAR.J
38

En las respuestas anteriores, el peso se pasa al constructor de un nuevo objeto SomeLayoutType.LayoutParams. Aún así, en muchos casos es más conveniente usar objetos existentes; ayuda a evitar tratar con parámetros que no nos interesan.

Un ejemplo:

// Get our View (TextView or anything) object:
View v = findViewById(R.id.our_view); 

// Get params:
LinearLayout.LayoutParams loparams = (LinearLayout.LayoutParams) v.getLayoutParams();

// Set only target params:
loparams.height = 0;
loparams.weight = 1;
v.setLayoutParams(loparams);
sberezin
fuente
los loparams podrían ser NULL, así que asegúrese de verificar eso antes de llamar a setLayoutParams ()
AAgg
@AAgg, no en una situación práctica. La vista no se habría inflado si no hubiera establecido el ancho y la altura. Pero estoy de acuerdo: es una buena práctica verificar cuando hay dudas sobre nulo.
sberezin
16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f se denota como peso = 1; puede dar 2f o 3f, las vistas se moverán según el espacio


fuente
12

simplemente configure los parámetros de diseño en ese diseño como

crear variable param

 android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);

1f es variable de peso

configura tu widget o diseño como

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);
Manikandan
fuente
¿de dónde sacas esta información que 1f significa la variable de peso? ¿Me puede proporcionar un enlace por favor?
hayonj
@hayonj solo verifica las fuentes del LinearLayout.LayoutParamsconstructor. El tercer parámetro es el peso. O documentación
mente
11
TextView text = new TextView(v.getContext());
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                                LayoutParams.WRAP_CONTENT, 1f));

(O)

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

1f se refiere como peso = 1; según su necesidad, puede dar 2f o 3f, las vistas se moverán según el espacio. Para hacer una distancia especificada entre vistas en diseño lineal, utilice la suma de peso para "LinearLayout".

LinearLayout ll_Outer= (LinearLayout ) view.findViewById(R.id.linearview);
LinearLayout llInner = new LinearLayout(this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
            llInner.Orientation = Orientation.Horizontal;
            llInner.WeightSum = 2;
            ll_Outer.AddView(llInner);
anand krish
fuente
8

Esto debería funcionar para ti

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT LayoutParams.MATCH_PARENT);

param.weight=1.0f;
Ashok Reddy M
fuente
7

También puedes dar peso por separado de esta manera,

LayoutParams lp1 = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);

 lp1.weight=1;
kiran boghra
fuente
6

Esto funciona para mí, y espero que también funcione para ti

Establezca primero los LayoutParams para la vista principal:

myTableLayout.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT,
                TableLayout.LayoutParams.FILL_PARENT));

luego se establece para TextView (hijo):

 TableLayout.LayoutParams textViewParam = new TableLayout.LayoutParams
     (TableLayout.LayoutParams.WRAP_CONTENT,
     TableLayout.LayoutParams.WRAP_CONTENT,1f);
     //-- set components margins
     textViewParam.setMargins(5, 0, 5,0);
     myTextView.setLayoutParams(textViewParam); 
Najem1234
fuente
1

Hay otra forma de hacer esto. En caso de que necesite establecer solo un parámetro, por ejemplo 'altura':

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
Dmitry
fuente
1

Después de luchar por 4 horas. Finalmente, este código funcionó para mí.

Hay 3 columnas en una fila.

  TextView serialno = new TextView(UsersActivity.this);
  TextView userId = new TextView(UsersActivity.this);
  TextView name = new TextView(UsersActivity.this);

  serialno.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  userId.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  name.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
Gulshan Yadav
fuente
-1

Tuve bastante dificultad con una solución algo muy similar a esto: tratar de tener dos botones en una TableRow, cada uno con la mitad del ancho de la pantalla. Por alguna razón, el botón izquierdo siempre tendría aproximadamente el 70% del ancho y el botón derecho el 30%. Llamar a table_layout.setStretchAllColumns (true) no tuvo ningún efecto, ni configurar el ancho del botón a la mitad de la pantalla, ni configurar su peso de diseño.

La solución que terminó con la anidación fue un LinearLayout en los TableRows, que tenía tengan en cuenta el valor del ancho de los botones.

    TableLayout layout = new TableLayout(this);
    TableRow top_row = new TableRow(this);
    left_button = styleButton();
    right_button = styleButton();
    LinearLayout toprow_layout = new LinearLayout (this);
    toprow_layout.setOrientation(LinearLayout.HORIZONTAL);
    toprow_layout.addView (left_button);
    toprow_layout.addView(right_button);
    toprow.addView(top_layout);
    layout.addView(top_row)

    private Button styleButton() {
            Button btn = new Button (this);
            android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();      
            btn.setWidth((int)(display.getWidth()/2));    // set width to half
            btn.setHeight(((int)display.getHeight()/6));  // set height to whatevs
            btn.setText("foo");
            return btn;
        }
joseph_morris
fuente
1
Para que lo sepas en el futuro, la solución es configurar TableRow, Button1 y Button2 para que todos tengan layout_width=fill_parent, y después de hacerlo, configurar layout_weight=1ambos para button1 y button2. Todos los elementos con fill_parent y layout_weight = 1 recibirán un tamaño igual después de la inflación.
edthethird