android establecer estilo en el código


Estoy tratando de usar el constructor TextView con un estilo como este:

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 (verifiqué el estilo configurándolo en un objeto estático).

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

Author: Adarsh Gumashta, 2010-06-29

10 answers

No creo que pueda establecer el estilo programáticamente. Para evitar esto, puede crear un archivo xml de diseño de plantilla con el estilo asignado, por ejemplo, en res/layout create tvtemplate.xml como 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 infla esto para crear una instancia de tu nuevo TextView:

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

Espero que esto ayude.

 297
Author: Dan Kilpatrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-30 15:42:55

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

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

Editar: esto se refiere al Contexto

 110
Author: Shahul3D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-12 10:03:43

Puedes pasar un ContextThemeWrapper al constructor así:

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
 85
Author: maxcanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-03 07:56:10

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

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

Respuesta de Romain Guy

Referencia

 15
Author: Dandre Allison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-16 13:43:22

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

 5
Author: Chris Cashwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-30 15:45:45

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

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

Para configurar el estilo en View 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 argumentos constructor (disponible a partir de LOLLIPOP):

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

Cosa clave para ambas soluciones - defStyleAttr el parámetro debe ser 0 para aplicar nuestro estilo a la vista.

 4
Author: DmitryArc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-05 16:04:35

Cuando se utilizan vistas personalizadas que pueden usar herencia de estilo (o atributos de eventos estilables), debe modificar el segundo constructor para no perder el estilo. Esto funcionó para mí, sin necesidad de usar setTextAppearence():

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}
 2
Author: saiyancoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-12 20:12:08

La respuesta aceptada fue una gran solución para mí. Lo único que hay que añadir es acerca del método inflate().

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

La razón no es una forma de ajustarla, porque null se pasó como ViewGroup parent.

Puedes usarlo así:

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

Y el parent es el ViewGroup, desde donde te gusta ajustar android:layout_*.

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

Espero que sea útil para alguien.

 2
Author: Anor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-10 00:46:31

También me encontré con el problema, y encontré la manera de establecer el estilo programáticamente. Tal vez todos lo necesitan, así que actualizo allí.

El tercer param de View 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);
}

Así que debes pasar un tipo de R. attr.** rather than R. style.**

En mis códigos, hice los siguientes pasos:

Primero, personalice un attr personalizado para que lo usen los temas en attr.XML.

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

Segundo, especifica tu estilo en tu usado tema con estilo.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, ¡úsalo!

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

La vista creada programáticamente utilizará el estilo especificado en su tema.

Usted puede tener una oportunidad, y espero que pueda trabajar para usted perfectamente.

 1
Author: mrtwo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-17 03:38:46

Solo he probado con EditText pero puedes usar el método

Public void setBackgroundResource (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.

Saludos.

 0
Author: floydaddict,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-11 15:41:52