目前,我正在使用WebView或TextView来显示来自我的某个应用中的网络服务的动态数据。 如果数据包含纯文本,则它使用TextView并从styles.xml应用样式。 如果数据包含HTML(主要是文本和图像),则使用WebView。
但是,这个WebView没有样式。因此它看起来与通常的TextView有很大的不同。 我已经读过,只需将一些HTML直接插入数据中,就可以在WebView中设置文本样式。这听起来很容易,但我想使用我的Styles.xml中的数据作为此HTML中所需的值,因此如果我更改样式,我将不需要更改两个位置的颜色等。
那么,我怎么能这样做呢?我做了一些广泛的搜索,但我发现无法从styles.xml中实际检索不同的样式属性。我在这里遗漏了什么或者是否真的无法检索这些值?
我试图从中获取数据的样式如下:
<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>
我主要对textSize和textColor感兴趣。
答案 0 :(得分:149)
可以通过编程方式从styles.xml
检索自定义样式。
在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>
现在,检索这样的样式
// 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()
答案 1 :(得分:42)
@Ole给出的答案在使用某些属性时似乎会中断,例如shadowColor,shadowDx,shadowDy,shadowRadius(这些只是我发现的几个,可能还有更多)
我不知道为什么这个问题出现了,我问的是here,但@AntoineMarques编码风格似乎解决了这个问题。
为了使这个工作与任何属性,它将是这样的
<小时/> 首先,定义一个stylable来包含资源ID,如
attrs.xml
<resources>
<declare-styleable name="MyStyle" >
<attr name="android:textColor" />
<attr name="android:background" />
<attr name="android:text" />
</declare-styleable>
</resources>
然后在代码中你会这样做以获取文本。
TypedArray ta = obtainStyledAttributes(R.style.MyCustomStyle, R.styleable.MyStyle);
String text = ta.getString(R.styleable.MyStyle_android_text);
使用此方法的优点是,您要按名称而不是索引检索值。
答案 2 :(得分:0)
Ole和PrivatMamtora的答案对我来说效果不佳,但确实如此。
假设我想以编程方式阅读此样式:
<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>
我可以这样:
fun getTextColorSizeAndFontFromStyle(
context: Context,
textAppearanceResource: Int // Can be any style in styles.xml like R.style.Footnote
) {
val typedArray = context.obtainStyledAttributes(
textAppearanceResource,
R.styleable.TextAppearance // These are added to your project automatically.
)
val textColor = typedArray.getColorStateList(
R.styleable.TextAppearance_android_textColor
)
val textSize = typedArray.getDimensionPixelSize(
R.styleable.TextAppearance_android_textSize
)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val typeface = typedArray.getFont(R.styleable.TextAppearance_android_fontFamily)
// Do something with the typeface...
} else {
val fontFamily = typedArray.getString(R.styleable.TextAppearance_fontFamily)
?: when (typedArray.getInt(R.styleable.TextAppearance_android_typeface, 0)) {
1 -> "sans"
2 -> "serif"
3 -> "monospace"
else -> null
}
// Do something with the fontFamily...
}
typedArray.recycle()
}
我从Android的TextAppearanceSpan类中获得了一些启发,您可以在这里找到它:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/style/TextAppearanceSpan.java
答案 3 :(得分:-2)
如果接受的解决方案不起作用,请尝试将attr.xml重命名为attrs.xml(为我工作)