Estoy tratando de usar el TextView
constructor 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.
Puede crear un estilo genérico y reutilizarlo en múltiples vistas de texto como el siguiente:
Editar: esto se refiere al contexto
fuente
TextViewCompat.setTextAppearance
Puede pasar un ContextThemeWrapper al constructor así:
fuente
<style name="TabButton"><item name="android:background">@drawable/tabbar_button_bkgnd</item>...</style>
. Y entonces 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í?parent="@android:style/Widget.Button"
parent
no cambió un poco. Así que seguí adelante con lainflate
solución.new Button(new ContextThemeWrapper(context, R.style.TabButton), null, 0)
. De lo contrario, se aplicará el estilo de botón predeterminado, y este estilo anulará el estilo de botón que ha fusionado con el tema a través de ContextThemeWrapper.Puede configurar el estilo en el constructor (pero los estilos no se pueden cambiar / configurar dinámicamente).
View(Context, AttributeSet, int)
(int
es un atributo en el tema actual que contiene una referencia a un estilo)Respuesta de Romain Guy
referencia
fuente
El parámetro int
defStyleAttr
no especifica el estilo. De la documentación de Android:Para configurar el estilo en View constructor tenemos 2 posibles soluciones:
Con el uso de ContextThemeWrapper:
Con el constructor de cuatro argumentos (disponible a partir de LOLLIPOP):
Lo clave para ambas soluciones: el
defStyleAttr
parámetro debe ser 0 para aplicar nuestro estilo a la vista.fuente
Cambiar estilos dinámicamente no es compatible (todavía). Debe establecer el estilo antes de que se cree la vista, a través de XML.
fuente
La respuesta aceptada fue una gran solución para mí. Lo único para agregar es sobre el
inflate()
método.En la respuesta aceptada
android:layout_*
no se aplicarán todos los parámetros.La razón no es forma de ajustarlo, la causa
null
se pasó comoViewGroup parent
.Puedes usarlo así:
View view = inflater.inflate(R.layout.view, parent, false);
y el
parent
es elViewGroup
, desde donde te gusta ajustarandroid:layout_*
.En este caso, se establecerán todas las propiedades relativas.
Espero que sea útil para alguien.
fuente
Al usar vistas personalizadas que pueden usar herencia de estilo (o atributos con estilo de evento), debe modificar el segundo constructor para no perder el estilo. Esto funcionó para mí, sin necesidad de usar setTextAppearence () :
fuente
También conocí el problema y encontré la manera de establecer un estilo programáticamente. Quizás todos lo necesiten, así que actualizo allí.
El tercer parámetro de View constructor acepta un tipo de atributo en su tema como el código fuente a continuación:
Por lo tanto, debe pasar un tipo de R.attr. ** en lugar de R.style. **
En mis códigos, hice los siguientes pasos:
Primero, personalice un atributo personalizado para que lo utilicen los temas en attr.xml.
Segundo, especifique su estilo en su tema usado en style.xml.
¡Al final, úsalo!
la vista creada programáticamente usará el estilo especificado en su tema.
Puedes intentarlo y esperar que te funcione perfectamente.
fuente
Solo he probado con EditText pero puedes usar el método
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.
fuente
Podemos usar
TextViewCompact.setTextAppearance(textView, R.style.xyz)
.Documento de Android para referencia.
fuente