2012-02-28 9 views
13

En mi aplicación, quiero establecer el margen superior e inferior de 8 inmersión en una vista de texto. Así que si lo hago como -Establezca el margen en el estilo y aplique ese estilo a TextView programáticamente

<TextView 
android:id="@+id/tv_text1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
style="@style/settings_plain_text"/> 

que trabaja muy bien en el contenido de estilo son -

<style name="settings_plain_text"> 
    <item name="android:layout_marginTop"> 8dip </item> 
    <item name="android:layout_marginBottom"> 8dip </item> 
    <item name="android:textSize"> 18sp </item> 
</style> 

Pero cuando aplico el mismo estilo a la TextView programación como -

textview.setTextAppearance(context, R.style.settings_plain_text); 

no muestra el margen superior e inferior que he establecido con estilo. Por favor ayuda.

+0

posible duplicado de [conjunto estilo androide de código] (http://stackoverflow.com/questions/3142067/android-set-style -en codigo); 'setTextAppearance()' solo cambia la apariencia del texto como sugiere el nombre, que no incluye los márgenes. Establecer el estilo de la Vista es más complicado y está vinculado en la pregunta que mencioné aquí como un duplicado (porque básicamente es la misma pregunta subyacente). –

+0

posible duplicado de [Estilo de inflado en la vista de Android en tiempo de ejecución] (http://stackoverflow.com/questions/29437095/inflate-style-on-android-view-on-runtime#comment47067374_29437095) – corsair992

+0

@ corsair992 En realidad debería comentar esa pregunta como posible duplicado ya que esta pregunta fue hecha 3 años antes de esa pregunta. :) – Rajkiran

Respuesta

-1

Puede lograrlo utilizando este código.

TextView tv = (TextView)findViewById(R.id.tv_text1); 
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams(); 
params.setMargins(0, 8, 0, 8); //substitute parameters for left, top, right, bottom 
tv.setLayoutParams(params); 

Espero que ayude!

EDIT:

public final class Values { 
    public static final int MARGIN_TOP = 8; 
    public static final int MARGIN_BOTTOM = 8; 
} 

TextView tv = (TextView)findViewById(R.id.tv_text1); 
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams(); 
params.setMargins(0, Values.MARGIN_TOP, 0, Values.MARGIN_BOTTOM); //substitute parameters for left, top, right, bottom 
tv.setLayoutParams(params); 
+0

Lea la pregunta por completo. La pregunta sugiere claramente que necesita margen en los estilos ... por lo que no tengo que definirlo para cada texto Ver todo el tiempo. P.S. ¿Qué ocurre con su respuesta si se supone que el margen debe cambiarse a 10 píxeles en lugar de a 8? Shoudl, ¿encuentro todas las líneas y las cambio en todos lados?:) – Rajkiran

+0

@Rajkiran puedes obtenerlo haciendo una clase estática con los valores. Si desea cambiar el valor, simplemente cámbielo en la clase de Valores – Nacho

+0

. Esperaba esta respuesta. ¿Qué hay del resto de los estilos? No puede (incluso si lo hace, no debería) hacer todas las cosas de UI en archivos Java en lugar de XML. Los estilos son los mejores. Gracias por la respuesta sin embargo. – Rajkiran

0

setTextAppearence(..) solamente configuraciones de atributos XML con el prefijo android:text_* pero todavía se puede escribir método propio que lee otros atributos y establece mediante programación conocer la LayoutParams implementación subyacente.

agradar a la mente que puede utilizar un ContextThemeWrapper para la obtención de los valores de tema específico o pasar un identificador de recurso, muebles patinados en .obtainStyledAttributes(..)

A modo de ejemplo:

int[] attrs= new int[] { 
    android.R.attr.layout_marginTop,  // 0 
    android.R.attr.layout_marginLeft, // 1 
    android.R.attr.layout_marginRight, // 2 (used in example) 
    android.R.attr.layout_marginBottom}; // 3 
final TypedArray arr = context.obtainStyledAttributes(attrs); 
try { 
    // ... 
    layoutParams.rightMargin = arr.getDimensionPixelSize(2); 
    // ... 
} finally { 
    arr.recycle(); 
} 
0
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(textView.getLayoutParams()); 
    lp.setMargins(10, 20, 10, 20); 
    textView.setLayoutParams(lp); 

// xml mis padres el diseño de textView es RelativeLayout.

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/colorPrimary"> 
    <TextView 
    android:id="@+id/test" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@color/bg_gradient_end" 
    android:text="zdfhzfdh"/> 
</RelativeLayout 
0

versión más simplificada del respondida por Gianluca P.

public void applyTextStyle(TextView v, int styleResId) 
{ 
    int[] attrs= new int[] { 
      android.R.attr.layout_marginTop,  // 0 
      android.R.attr.layout_marginLeft, // 1 
      android.R.attr.layout_marginBottom, // 2 
      android.R.attr.layout_marginRight}; // 3 (used in example) 
    final TypedArray arr = this.obtainStyledAttributes(styleResId,attrs); 
    try { 
     ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); 
     lp.topMargin = arr.getDimensionPixelSize(0,lp.topMargin); 
     lp.leftMargin = arr.getDimensionPixelSize(1,lp.leftMargin); 
     lp.bottomMargin = arr.getDimensionPixelSize(2,lp.bottomMargin); 
     lp.rightMargin = arr.getDimensionPixelSize(3,lp.rightMargin); 

     v.requestLayout(); 
    } finally { 
     arr.recycle(); 
    } 
} 
Cuestiones relacionadas