2010-06-29 9 views
216

Estoy tratando de utilizar el constructor Vista de Texto con el estilo de esta manera:conjunto estilo androide en el código

TextView myText = new TextView(MyActivity.this, null, R.style.my_style);

Sin embargo, cuando hago esto, la vista de texto no parece tener el estilo (I verificó el estilo al establecerlo en un objeto estático).

También he intentado usar myText.setTextAppearance(MyActivity.this, R.style.my_style) pero también no funciona

Respuesta

294

no creo que usted puede ajustar el estilo de programación. Para evitar esto se puede crear un archivo XML plantilla de diseño con el estilo asignado, por ejemplo, en res/layout crear tvtemplate.xml al igual que con el siguiente contenido:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="This is a template" 
     style="@style/my_style" /> 

luego se inflan para crear instancias de esta su nueva Vista de Texto:

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null); 

Espero que esto ayude.

+1

Donde esto gana La respuesta de Dandre Allison es que no requiere API v11. –

+0

¡La única respuesta que realmente funcionó para mí, gracias! – Justin

+2

Podría haber funcionado, pero esto no tiene sentido. ¿Cómo se puede establecer con el archivo xml? si no ** programáticamente **. Hay razones para no usar archivos xml, uno de ellos es que estoy acostumbrado a escribir código para construir la interfaz de usuario, así que no quiero aprender una nueva forma de hacerlo, ya que mi memoria es limitada y quiero mantener algo de espacio para otras cosas. –

5

No se admite el cambio dinámico de estilos (todavía). Debe establecer el estilo antes de se crea la vista, a través de XML.

+20

que pasa a ser lo mismo, en realidad – njzk2

+0

@ njzk2 gracias ... obviamente no pensó en su comentario antes de publicarlo. No hay forma de establecer el estilo mediante programación antes de que se construya la IU, por lo tanto, el mismo código se usaría para cambiar o establecer el estilo mediante programación. –

0

Sólo he probado con EditarTexto pero se puede usar el método

setBackgroundResource public void (int resid)

para aplicar un estilo definido en un archivo XML.

Sine este método pertenece a View Creo que funcionará con cualquier elemento de la interfaz de usuario.

respetos.

+0

De acuerdo con [la documentación] (http://developer.android.com/reference/android/view/View.html#setBackgroundResource (int)), esto solo debería funcionar con los estilos, no con el estilo. Por lo tanto, si esto realmente funciona, es solo "por accidente" y no deberías confiar en él. – Heinzi

106

Puede crear un estilo genérico y reutilizarlo en múltiples textviews como la siguiente:

textView.setTextAppearance(this, R.style.MyTextStyle); 

Editar: este se refiere al contexto

+4

Nota: this = context –

+45

Su respuesta funciona siempre que todo lo que hace es monkeying con el "estilo" del texto. No funciona si intenta hacer otras cosas con TextView, como añadir margen o márgenes. Entonces, no digo que estés equivocado, pero tu respuesta es limitada. Inflar la vista en el tiempo de ejecución es la única forma de aplicar un estilo integral. –

+0

Esto no se puede aplicar también ... –

15

Puede configurar el estilo en el constructor (pero los estilos no se pueden cambiar/configurar dinámicamente).

View(Context, AttributeSet, int) (el int es un recurso de estilo)

Answer from Romain Guy

reference

+0

su respuesta es engañosa. ¿Ha intentado leer este hilo hasta el final? – andr

+3

¿Cómo es engañar? La respuesta aceptada es engañosa, porque Romain Guy explícitamente dice que puede "establecer" un estilo programáticamente. Simplemente no hay una facilidad para cambiarlo dinámicamente. Sin embargo, este hilo no parece pensar que ese sea el caso. –

+1

Tenga cuidado, esta llamada requiere API nivel 11. –

84

puede pasar un ContextThemeWrapper al constructor de la siguiente manera:

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style)); 
+1

¡cosas geniales! la única forma en que podía establecer estilos programáticamente mientras admitía API 8. – tbraun

+0

Por alguna razón, no afecta el estilo de mi botón. He definido mi estilo como: ''. Y luego lo invoco con una construcción: 'new Button (new ContextThemeWrapper (context, R.style.TabButton));'. Pero el botón simplemente ignora mi configuración. ¿Estoy haciendo algo mal aquí? –

+0

@ AlaksiejN.Debería heredar del estilo Widget.Button como este 'parent =" @ android: style/Widget.Button "' – maxcanna

1

Al utilizar vistas personalizadas que puede usar herencia de estilo (o atributos de estilo de evento), y Tienes que modificar el segundo constructor para no perder el estilo.Esto funcionó para mí, sin necesidad de utilizar setTextAppearence():

public CustomView(Context context, AttributeSet attrs) { 
    this(context, attrs, attrs.getStyleAttribute()); 
} 
2

La respuesta fue aceptada gran solución para mí. Lo único que se debe agregar es el método inflate().

En respuesta aceptada, no se aplicarán todos los parámetros android:layout_*.

La razón no es manera de ajustarlo, porque null se pasó como ViewGroup parent.

Se puede utilizar la siguiente manera:

View view = inflater.inflate(R.layout.view, parent, false);

y la parent es el ViewGroup, desde donde se desea ajustar android:layout_*.

En este caso, se establecerán todas las propiedades relativas.

Espero que sea útil para alguien.

1

Me encontré con el problema también, y encontré la manera de establecer el estilo de forma programática. Quizás todos lo necesiten, así que actualizo allí.

El tercer parámetro de vista constructor acepta un tipo de attr en su tema como el código fuente a continuación:.

public TextView(Context context, AttributeSet attrs) { 
    this(context, attrs, com.android.internal.R.attr.textViewStyle); 
} 

por lo que debe pasar un tipo de R.attr ** en lugar de R.style. **

en mis códigos, lo hice siguiendo los pasos:

en primer lugar, personalizar un attr personalizado para ser utilizado por temas en attr.xml.

<attr name="radio_button_style" format="reference" /> 

En segundo lugar, especifique su estilo en el tema usado en style.xml.

<style name="AppTheme" parent="android:Theme.Translucent"> 
    <!-- All customizations that are NOT specific to a particular API-level can go here. --> 
    <item name="radio_button_style">@style/radioButtonStyle</item> 
</style> 
<style name="radioButtonStyle" parent="@android:style/Widget.CompoundButton.RadioButton"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">64dp</item> 
    <item name="android:background">#000</item> 
    <item name="android:button">@null</item> 
    <item name="android:gravity">center</item> 
    <item name="android:saveEnabled">false</item> 
    <item name="android:textColor">@drawable/option_text_color</item> 
    <item name="android:textSize">9sp</item> 
</style> 

Al final, úselo!

  RadioButton radioButton = new RadioButton(mContext, null, R.attr.radio_button_style); 

la vista creada programáticamente usará el estilo especificado en su tema.

Puede probarlo, y espero que le sirva perfectamente.

2

El parámetro int defStyleAttr no especifica el estilo. De la documentación Android:

defStyleAttr - Un atributo en el tema actual que contiene una referencia a un recurso estilo que proporciona valores predeterminados para la vista . Puede ser 0 para no buscar los valores predeterminados.

Para configurar el estilo de Vista constructor tenemos 2 posibles soluciones:

  1. Con el uso de ContextThemeWrapper:

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style); 
    TextView textView = new TextView(wrappedContext, null, 0); 
    
  2. Con cuatro argumento del constructor (disponible a partir de EL LOLLIPOP) :

    TextView textView = new TextView(yourContext, null, 0, R.style.your_style); 
    

La clave para ambas soluciones - defStyleAttr El parámetro debería ser 0 para aplicar nuestro estilo a la vista.

Cuestiones relacionadas