2010-07-11 18 views
191

Estoy tratando de crear dinámicamente objetos TableRow y agregarlos a un TableLayout. Los objetos TableRow tienen 2 elementos, un TextView y un CheckBox. Los elementos TextView deben tener su peso de diseño establecido en 1 para empujar los elementos CheckBox hacia el extremo derecho.Establecer el peso de diseño de un TextView programmatically

No encuentro la documentación sobre cómo establecer programáticamente el peso de diseño de un elemento TextView.

Respuesta

337

usted tiene que utilizar TableLayout.LayoutParams con 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.

+14

no he mencionado esto antes, así que lo siento. Pero probé esto antes de hacer mi pregunta. Hace que TextView desaparezca del diseño. Pero, en una nota positiva, encontré que establecer la propiedad stretch_columns de TableLayout en 0 causa el efecto que estoy buscando (TextView está a la izquierda, CheckBoxes a la derecha). Gracias por la ayuda. – eugene

+8

Si está importando un diseño XML y no está creando su diseño dinámicamente, puede tomarlo de esta manera: 'TextView tv = (TextView) findViewById (R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f)); ' –

+4

Para establecer el peso del diseño mediante programación, se debe usar' TableRow.LayoutParams' en lugar de 'TableLayout.LayoutParams'. Ver la respuesta de @Dorje. – Halil

-1

Tuve una gran cantidad de dificultad con una solución algo muy similar a esto: tratando de tener dos botones en un TableRow, con cada uno de ellos la mitad del ancho de la pantalla. Por alguna razón, el botón izquierdo siempre será alrededor del 70% del ancho, y el botón derecho 30%. Llamar a table_layout.setStretchAllColumns (true) no tuvo ningún efecto, ni establecer el ancho del botón a la mitad de la pantalla, ni establecer su peso de diseño.

La solución con la que terminé fue anidar un LinearLayout en TableRows, que tomó teniendo 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; 
     } 
+1

Para que sepas para el futuro, la solución es configurar TableRow, Button1 y Button2 para que tengan 'layout_width = fill_parent', y luego de hacerlo, establece' layout_weight = 1' para button1 y button2. Todos los elementos con fill_parent y un layout_weight = 1 recibirán el mismo tamaño después de la inflación. – edthethird

86

La respuesta es que usted tiene que utilizar 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 utiliza el incorrecto, parece que no ocurre nada. Los padres del punto de vista de texto es una fila de la tabla, por lo tanto:

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

+0

Esta respuesta me ayudó mucho ... TableLayout no funcionó para mí –

+0

Aw hombre, me has ahorrado tanto tiempo. ¿Dónde está especificado? No encontré nada en la documentación acerca de usted no puede intercambiar 'LayoutParams' –

+0

' TableRow.LayoutParams' hizo el trabajo por mí también –

5

Este trabajo para mí, y espero que va a trabajar para usted también

Establecer los LayoutParams para la vista padre primero:

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

continuación, establezca para el TextView (niño):

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

acaba de establecer parametros de diseño en esa disposición como

crear variable de parámetro

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

1F es variable peso

establece el widget o el diseño como

TextView text = (TextView) findViewById(R.id.text); 
text.setLayoutParams(params); 
+0

donde obtiene esta información que 1f significa la variable de peso? ¿Puedes proporcionar un enlace por favor? – hayonj

+0

@hayonj solo revisa las fuentes del constructor 'LinearLayout.LayoutParams'.El tercer parámetro es el peso. O [documentación] (http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html) – mente

1

Hay otra manera de hacer esto .En caso de tener que establecer sólo 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); 
+0

nota, no funciona para 2.3 – djdance

6

También se puede dar el peso por separado como este,

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

lp1.weight=1; 
34

en las respuestas anteriores peso se pasa a la constructor de un nuevo objeto SomeLayoutType.LayoutParams. Sin embargo, en muchos casos es más conveniente utilizar los objetos existentes - que ayuda a evitar el trato con los parámetros que no estamos interesados ​​en

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

loparams podría ser NULO, así que asegúrese de comprobarlo antes de llamar a setLayoutParams() – AAgg

+0

@AAgg, no en una situación práctica. La vista no se habría inflado si no hubiera configurado el ancho y el alto. Pero estoy de acuerdo, es una buena práctica verificar cuándo hay dudas sobre el nulo. – sberezin

10
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 establecer la distancia especificada entre las vistas en el diseño lineal, use weightsum 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); 
11
TextView txtview = new TextView(v.getContext()); 
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f); 
txtview.setLayoutParams(params); 

1F es denota peso = 1; usted puede dar 2F o 3F, vistas accoding se moverá al espacio

5

Este debe a las obras que

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

param.weight=1.0f; 
Cuestiones relacionadas