93 votes

Comment récupérer des attributs de style par programme à partir de styles.xml

Actuellement, je suis en utilisant soit une WebView ou un TextView à montrer une certaine dynamique de données provenant d'un webservice dans une de mes applications. Si les données contiennent du texte pur, il utilise le TextView et applique un style de styles.xml. Si les données contiennent du code HTML (principalement du texte et des images), il utilise la WebView.

Cependant, cette WebView est non stylé. À cet effet, il a l'air très différent de l'habituel TextView. J'ai lu qu'il est possible de définir le style du texte dans une WebView simplement en insérant le code HTML directement dans les données. Cela semble assez facile, mais je voudrais utiliser les données de mon Styles.xml comme les valeurs requises dans ce format HTML afin de ne pas avoir besoin de changer les couleurs et cetera sur deux emplacements si je change de styles.

Alors, comment pourrais-je être capable de faire cela? J'ai fait quelques poussées à chercher, mais je n'ai trouvé aucun moyen de récupérer les différents attributs de style de votre styles.xml. Suis-je manqué quelque chose ou est-il vraiment pas possible de récupérer ces valeurs?

Le style que je suis en train de récupérer des données est la suivante:

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

Je m'intéresse principalement à la textSize et textColor.

Merci à l'avance.

196voto

Ole Points 3962

Il est possible de récupérer des styles personnalisés de styles.xml programmation.

Définissez un style arbitraire 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>
 

Maintenant, récupérez les styles comme celui-ci

 // 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()
 

58voto

PrivatMamtora Points 366

La réponse @Ole a donné semble se briser lors de l'utilisation de certains attributs, tels que shadowColor, shadowDx, shadowDy, shadowRadius (ce ne sont que quelques-uns que j'ai trouvé, il y a peut être d'autres)

Je n'ai aucune idée de pourquoi ce problème se produit, que je suis en demandant au sujet ici, mais @AntoineMarques style de codage semble résoudre le problème.

Pour faire ce travail avec n'importe quel attribut il serait quelque chose comme ceci


Tout d'abord, définir un styliser pour contenir l'id de ressource comme

attrs.xml

<resources>     
    <declare-styleable name="MyStyle" >
        <attr name="android:textColor" />
        <attr name="android:background" />
        <attr name="android:text" />
    </declare-styleable>
</resources>

Ensuite, dans le code, vous voulez faire cela pour obtenir le texte.

TypedArray ta = obtainStyledAttributes(R.style.MyCustomStyle, R.styleable.MyStyle);  
String text = ta.getString(R.styleable.MyStyle_android_text);

L'avantage de cette méthode est, vous êtes à la récupération de la valeur par leur nom et non d'un index.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X