2011-01-27 15 views
76

Tengo TextView agregado mediante programación en LinearLayout y en algunos eventos externos. Quiero disminuir el margen inferior de ese TextView a -10, para eso intenté seguir.Cómo cambiar el margen de TextView

LinearLayout.LayoutParams lastTxtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
lastTxtParams.setMargins(0, 0, 0, -10); 
mOldTextView.setLayoutParams(lastTxtParams); 
mOldTextView.invalidate(); 

¿Es la forma correcta de modificar el Margen de widget que se ha agregado a View?
De alguna manera no funciona.

Respuesta

5

setMargins() establece los márgenes INTERIOR de la Vista de texto, no los márgenes de diseño. ¿Es eso lo que quieres hacer? Estos dos márgenes diferentes pueden ser bastante complicados.

Si desea establecer los márgenes de diseño, cambie los LayoutParams de TextView (textview.getLayoutParams(), luego cambie los parámetros en el objeto LayoutParams devuelto).

No necesita cambiar nada en su LinearLayout.

Saludos, Oliver

174
TextView forgot_pswrd = (TextView) findViewById(R.id.ForgotPasswordText); 
forgot_pswrd.setOnTouchListener(this);  
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
llp.setMargins(50, 0, 0, 0); // llp.setMargins(left, top, right, bottom); 
forgot_pswrd.setLayoutParams(llp); 

lo hice y funcionó perfectamente. Tal vez dado que estás dando el valor en -ve, es por eso que tu código no está funcionando. Simplemente coloque este código donde está creando la referencia de la vista.

+0

Sólido. Gracias ... – trgraglia

+0

Esta llamada requiere API nivel 19. –

+4

@SanjayKumar - No, no hay ninguna restricción que requiera nivel de API 19 – Debarati

1

TextView no es compatible con setMargins. Android docs decir:

Aunque una vista puede definir un relleno, no proporciona ningún soporte para los márgenes. Sin embargo, los grupos de vista proporcionan tal soporte. Consulte ViewGroup y ViewGroup.MarginLayoutParams para obtener más información.

58

Su diseño en xml probablemente ya tenga un atributo layout_margin (Left | Right | etc), lo que significa que necesita acceder al objeto generado por ese xml y modificarlo.

He encontrado que esta solución sea muy simple:

ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView 
     .getLayoutParams(); 

mlp.setMargins(adjustmentPxs, 0, 0, 0); 

break; 

obtener la instancia LayoutParams de su TextView, abatido a MarginLayoutParams, y utilizar el método SetMargins para ajustar los márgenes.

+0

Esto me da ClassCastException: -> ViewGroup.LayoutParams no puede convertir a ViewGroup.MarginLayoutParams –

10

Éste es un problema espinoso, configuro el margen para la vista de texto en una fila de un diseño de tabla. ver el siguiente:

TableLayout tl = new TableLayout(this); 
tl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

TableRow tr = new TableRow(this);   
tr.setBackgroundResource(R.color.rowColor); 

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
params.setMargins(4, 4, 4, 4); 

TextView tv = new TextView(this); 
tv.setBackgroundResource(R.color.textviewColor); 
tv.setText("hello"); 
tr.addView(tv, params); 

TextView tv2 = new TextView(this); 
tv2.setBackgroundResource(R.color.textviewColor); 
tv2.setText("hi"); 
tr.addView(tv2, params); 

tl.addView(tr); 
setContentView(tl); 

la clase necesaria para la importación de LayoutParams para su uso en una fila de la tabla es:

import android.widget.**TableRow**.LayoutParams; 

importante señalar que he añadido a la clase de fila de la tabla. Del mismo modo muchas otras clases están disponibles para su uso como LayoutParams:

import android.widget.**RelativeLayout**.LayoutParams; 

android.widget importación. LinearLayout .LayoutParams;

así que utilícelo en consecuencia.

0

Probablemente estaba cambiando el margen de diseño después de haber sido dibujado. mOldTextView.invalidate() es inútil. Necesitabas invocar requestLayout() en el padre para retransmitir la nueva configuración. Cuando movió el código de cambio de diseño antes de que se llevara a cabo el dibujo, todo funcionó bien.

1

Aquí es otro enfoque ...

Cuando Tengo que el mismo problema, no me gustan las soluciones sugeridas aquí. lo tanto, yo he llegado con otra manera: he insertado una TextView en el archivo XML entre los dos campos que quería separar con dos campos importantes:

  1. visibilidad establecido en "Gone" (doesn 't ocupe cualquier espacio ..)
  2. la altura se establece en lo que sea que necesite la separación.

    XML: 
    ...//some view up here 
    <TextView 
        android:id="@+id/dialogSeparator" 
        android:layout_width="match_parent" 
        android:layout_height="30dp" 
        android:visibility="gone"/> 
    ...//some view down here 
    

Ahora, el código, todo lo que necesitaba para hacerlo simple cambio de la visibilidad a invisible (es decir, que está ahí, y tomando el espacio necesario, pero es invisible)

JAVA: 

    TextView tvSeparator = (TextView)activity.findViewById(R.id.dialogSeparator); 
    tvSeparator.setVisibility(View.INVISIBLE); 
    //Inside an activity extended class I can use 'this' instead of 'activity'. 

Viola ... obtuve el margen necesario. BTW, esta solución es para LinearLayout con orientación vertical, pero puede hacerlo con diferentes diseños.

Espero que esto ayude.

0
 TextView tv = (TextView)findViewById(R.id.item_title)); 
     RelativeLayout.LayoutParams mRelativelp = (RelativeLayout.LayoutParams) tv 
        .getLayoutParams(); 
     mRelativelp.setMargins(DptoPxConvertion(15), 0, DptoPxConvertion (15), 0); 
     tv.setLayoutParams(mRelativelp); 

    private int DptoPxConvertion(int dpValue) 
    { 
     return (int)((dpValue * mContext.getResources().getDisplayMetrics().density) + 0.5); 
    } 

getLayoutParams() de TextView deben ser fundidas a la Parámetros correspondiente basado en la Padres de la TextView en xml.

<RelativeLayout> 
    <TextView 
    android:id="@+id/item_title"> 
</RelativeLayout> 

para hacer que el mismo tamaño real en diferentes dispositivos utilizan método DptoPxConvertion() que he utilizado anteriormente. Los parámetros setMargin (left, top, right, bottom) tomarán valores en píxeles no en dp. Para obtener más información, consulte este Link Answer

Cuestiones relacionadas