theme textcolorprimary textappearance style studio apptheme android textview coding-style android-textview

textcolorprimary - Android set estilo en el código



textappearance android (10)

Cuando se usan vistas personalizadas que pueden usar la herencia de estilo (o atributos de estilo de evento), 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()); }

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 tomar 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


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


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

defStyleAttr : un atributo en el tema actual que contiene una referencia a un recurso de estilo que proporciona valores predeterminados para la vista. Puede ser 0 para no buscar valores por defecto.

Para configurar el estilo en View constructor tenemos 2 soluciones posibles:

  1. Con el uso de ContextThemeWrapper:

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

  2. Con el constructor de cuatro argumentos (disponible a partir de LOLLIPOP):

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

Lo importante para ambas soluciones: el parámetro defStyleAttr debe ser 0 para aplicar nuestro estilo a la vista.


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

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

El motivo no es una forma de ajustarlo, 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 de utilidad para alguien.


No creo que puedas configurar el estilo programáticamente. Para solucionar esto, puede crear un archivo xml de diseño de plantilla con el estilo asignado, por ejemplo, en res / layout cree 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 infle esto para crear una instancia de su nuevo TextView:

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

Espero que esto ayude.


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)

Respuesta de Romain Guy

reference


Puede crear un estilo genérico y reutilizarlo en múltiples vistas de texto como la que se muestra a continuación:

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

Editar: esto se refiere al contexto


Puede pasar un ContextThemeWrapper al constructor de esta manera:

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


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.

Sin embargo, este método pertenece a View. Creo que funcionará con cualquier elemento de UI.

Saludos.


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

El tercer parámetro del constructor View acepta un tipo de elemento 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. ** en lugar de R.style. **

En mis códigos, hice los siguientes pasos:

Primero, personalice un attr personalizado para que lo utilicen los temas en attr.xml.

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

Segundo, especifique su estilo en su 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, úsalo!

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

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

Puedes intentarlo y espero que funcione perfectamente para ti.