2012-12-05 12 views
61

Momentan verwende ich entweder ein WebView oder eine TextView, um einige dynamische Daten von einem Webservice in einer meiner Apps anzuzeigen. Wenn die Daten reinen Text enthalten, verwendet sie die Textansicht und wendet einen Stil aus styles.xml an. Wenn die Daten HTML enthalten (hauptsächlich Text und Bilder), verwendet sie das WebView.Wie Sie Stilattribute programmgesteuert aus styles.xml abrufen

Diese WebView ist jedoch unstyled. Daher sieht es viel anders aus als das übliche TextView. Ich habe gelesen, dass es möglich ist, den Text in einem WebView einfach durch Einfügen von HTML direkt in die Daten zu stylen. Das klingt einfach, aber ich würde gerne die Daten aus meiner Styles.xml als die Werte verwenden, die in diesem HTML erforderlich sind, so dass ich nicht die Farben usw. an zwei Stellen ändern muss, wenn ich meine Stile ändere.

Also, wie könnte ich das tun? Ich habe umfangreiche Suchen durchgeführt, aber ich habe keine Möglichkeit gefunden, die verschiedenen Stilattribute aus Ihrer styles.xml abzurufen. Fehle ich hier etwas oder ist es wirklich nicht möglich, diese Werte abzurufen?

Der Stil Ich versuche, aus den Daten zu erhalten, ist die folgende:

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

Ich bin in erster Linie in der textsize und Textfarbe interessiert.

+0

Warum Sie nicht nur die XML parsen (z Androids SAX-Parser)? – m0skit0

Antwort

128

Es ist möglich, benutzerdefinierte Stile von styles.xml programmgesteuert abzurufen.

definieren etwas willkürlich Stil in 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> 

Nun rufen Sie die Stile wie dieses

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

Super Arbeitskollege. Nachdem man es gesagt hat (und es viel gelesen hat), dass es nicht gemacht werden konnte, hat man es perfekt gezeigt. Habe es einfach ausprobiert und ich konnte die Schriftfarbe von meinem Stil bekommen. Ich kann die Textsize noch nicht ganz bekommen, aber ich werde es herausfinden.100 Punkte kommen, sobald ich die Bounty schicken kann (in 18 Stunden). Danke vielmals! –

+4

ist es auch möglich, die Werte zu ändern, die zur Laufzeit definiert sind? – ekjyot

+0

Was ist, wenn ich die Farbe der abgerufenen Attribute ändern möchte? Wie ändert man dynamisch den Hintergrund oder die Textfarbe innerhalb dieses Codes? – MSIslam

28

Die Antwort @Ole gegeben hat, scheint bestimmte Attribute zu brechen bei der Verwendung, wie shadow, shadowDx, shadowDy, shadowRadius (das sind nur ein paar, die ich gefunden habe, es könnte mehr sein)

Ich habe keine Ahnung wie warum Dieses Problem tritt auf, die ich über here frage, aber @AntoineMarques Codierung scheint das Problem zu lösen.

Um diese Arbeit zu machen mit jedem Attribut es so etwas wie dieses


Zuerst wäre, eine frisierbar definieren, um die Ressourcen-IDs wie so

attrs.xml

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

Dann im Code enthalten, die Sie würde dies tun, um den Text zu bekommen.

Der Vorteil der Verwendung dieser Methode besteht darin, dass Sie den Wert nach Namen und nicht nach einem Index abrufen.

+3

Dies sollte die akzeptierte Antwort sein, da die Antwort von Ole eine "erwartete Ressource von Typ styleable" Warnung für mich erzeugte. – thecoolmacdude

+1

Funktioniert für mich, aber mit Android Studio muss ich das mit einem '@SuppressWarnings (" ResourceType ")' voranstellen. – eruve

+2

Diese Antwort sollte die akzeptierte sein. Es ist Arbeit für all mein Attribut, und das am meisten gewählte hat mich viel Zeit verschwendet. – jerry

0

Wenn akzeptierte Lösung nicht zu versuchen arbeiten attr.xml zu umbenennen attrs.xml (für mich gearbeitet)

Verwandte Themen