Actualmente estoy usando WebView o TextView para mostrar algunos datos dinámicos provenientes de un servicio web en una de mis aplicaciones. Si los datos contienen texto puro, usa TextView y aplica un estilo de styles.xml. Si los datos contienen HTML (principalmente texto e imágenes), utiliza WebView.
Sin embargo, este WebView no tiene estilo. Por lo tanto, se ve muy diferente del TextView habitual. Leí que es posible diseñar el texto en un WebView simplemente insertando algo de HTML directamente en los datos. Esto suena bastante fácil, pero me gustaría usar los datos de mi Styles.xml como los valores requeridos en este HTML, por lo que no necesitaré cambiar los colores, etcétera, en dos ubicaciones si cambio mis estilos.
Entonces, ¿cómo podría hacer esto? He realizado una búsqueda exhaustiva, pero no he encontrado forma de recuperar los diferentes atributos de estilo de su styles.xml. ¿Me estoy perdiendo algo aquí o realmente no es posible recuperar estos valores?
El estilo del que estoy tratando de obtener los datos es el siguiente:
<style name="font4">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">14sp</item>
<item name="android:textColor">#E3691B</item>
<item name="android:paddingLeft">5dp</item>
<item name="android:paddingRight">10dp</item>
<item name="android:layout_marginTop">10dp</item>
<item name="android:textStyle">bold</item>
</style>
Estoy interesado principalmente en textSize y textColor.
Respuestas:
Es posible recuperar estilos personalizados mediante
styles.xml
programación.Defina algún estilo arbitrario en
styles.xml
:<style name="MyCustomStyle"> <item name="android:textColor">#efefef</item> <item name="android:background">#ffffff</item> <item name="android:text">This is my text</item> </style>
Ahora, recupera los estilos como este
// The attributes you want retrieved int[] attrs = {android.R.attr.textColor, android.R.attr.background, android.R.attr.text}; // Parse MyCustomStyle, using Context.obtainStyledAttributes() TypedArray ta = obtainStyledAttributes(R.style.MyCustomStyle, attrs); // Fetch the text from your style like this. String text = ta.getString(2); // Fetching the colors defined in your style int textColor = ta.getColor(0, Color.BLACK); int backgroundColor = ta.getColor(1, Color.BLACK); // Do some logging to see if we have retrieved correct values Log.i("Retrieved text:", text); Log.i("Retrieved textColor as hex:", Integer.toHexString(textColor)); Log.i("Retrieved background as hex:", Integer.toHexString(backgroundColor)); // OH, and don't forget to recycle the TypedArray ta.recycle()
fuente
La respuesta que ha dado @Ole parece romperse cuando se usan ciertos atributos, como shadowColor, shadowDx, shadowDy, shadowRadius (estos son solo algunos que encontré, podría haber más)
No tengo idea de por qué ocurre este problema, por lo que estoy preguntando aquí , pero el estilo de codificación de @AntoineMarques parece resolver el problema.
Para que esto funcione con cualquier atributo, sería algo como esto
Primero, defina un estilo que contenga los ID de recursos como tal
attrs.xml
<resources> <declare-styleable name="MyStyle" > <attr name="android:textColor" /> <attr name="android:background" /> <attr name="android:text" /> </declare-styleable> </resources>
Luego, en el código, haría esto para obtener el texto.
La ventaja de utilizar este método es que está recuperando el valor por nombre y no por índice.
fuente
@SuppressWarnings("ResourceType")
.Las respuestas de Ole y PrivatMamtora no funcionaron bien para mí, pero esto sí.
Digamos que quería leer este estilo mediante programación:
<style name="Footnote"> <item name="android:fontFamily">@font/some_font</item> <item name="android:textSize">14sp</item> <item name="android:textColor">@color/black</item> </style>
Podría hacerlo así:
Me inspiré en la clase TextAppearanceSpan de Android, puedes encontrarla aquí: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/style/TextAppearanceSpan.java
fuente
Si la solución aceptada no funciona, intente cambiar el nombre de attr.xml a attrs.xml (funcionó para mí)
fuente