Derzeit verwende ich entweder eine WebView oder eine TextView, um einige dynamische Daten anzuzeigen, die von einem Webservice in einer meiner Apps stammen. Wenn die Daten reinen Text enthalten, wird die Textansicht verwendet und ein Stil aus der Datei styles.xml angewendet. Wenn die Daten HTML enthalten (hauptsächlich Text und Bilder), wird WebView verwendet.
Dieses WebView ist jedoch nicht formatiert. Daher sieht es ganz anders aus als die übliche TextView. Ich habe gelesen, dass es möglich ist, den Text in einer WebView zu formatieren, indem einfach HTML direkt in die Daten eingefügt wird. Das hört sich einfach an, aber ich möchte die Daten aus meiner Styles.xml als die in diesem HTML erforderlichen Werte verwenden, damit ich die Farben usw. nicht an zwei Stellen ändern muss, wenn ich meine Stile ändere.
Wie könnte ich das tun? Ich habe einige umfangreiche Suchvorgänge durchgeführt, aber ich habe keine Möglichkeit gefunden, die verschiedenen Stilattribute tatsächlich aus Ihrer styles.xml abzurufen. Vermisse ich hier etwas oder ist es wirklich nicht möglich, diese Werte abzurufen?
Der Stil, aus dem ich die Daten abrufen möchte, ist folgender:
<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 interessiere mich hauptsächlich für textSize und textColor.
Antworten:
Es ist möglich, benutzerdefinierte Stile
styles.xml
programmgesteuert abzurufen .Definieren Sie einen beliebigen 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>
Rufen Sie nun die Stile wie folgt ab
// 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()
quelle
Die Antwort, die @Ole gegeben hat, scheint zu brechen, wenn bestimmte Attribute wie shadowColor, shadowDx, shadowDy, shadowRadius verwendet werden (dies sind nur einige, die ich gefunden habe, möglicherweise gibt es mehr).
Ich habe keine Ahnung, warum dieses Problem auftritt, worüber ich hier frage , aber der Codierungsstil @AntoineMarques scheint das Problem zu lösen.
Damit dies mit einem beliebigen Attribut funktioniert, wäre es ungefähr so
Definieren Sie zunächst ein Stylable, das die Ressourcen-IDs wie folgt enthält
attrs.xml
<resources> <declare-styleable name="MyStyle" > <attr name="android:textColor" /> <attr name="android:background" /> <attr name="android:text" /> </declare-styleable> </resources>
Dann würden Sie dies im Code tun, um den Text zu erhalten.
Der Vorteil dieser Methode besteht darin, dass Sie den Wert anhand des Namens und nicht anhand eines Index abrufen.
quelle
@SuppressWarnings("ResourceType")
.Die Antworten von Ole und PrivatMamtora haben bei mir nicht gut funktioniert, aber das hat funktioniert.
Angenommen, ich wollte diesen Stil programmatisch lesen:
<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>
Ich könnte es so machen:
Ich habe mich von der TextAppearanceSpan-Klasse von Android inspirieren lassen. Sie finden sie hier: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/style/TextAppearanceSpan.java
quelle
Wenn die akzeptierte Lösung nicht funktioniert, versuchen Sie, attr.xml in attrs.xml umzubenennen (hat bei mir funktioniert)
quelle