是否有可能在TextView中设置文本跨度的颜色?
我想做一些类似于Twitter应用程序的事情,其中一部分文本是蓝色的。见下图:
(来源:twimg.com)
是否有可能在TextView中设置文本跨度的颜色?
我想做一些类似于Twitter应用程序的事情,其中一部分文本是蓝色的。见下图:
(来源:twimg.com)
当前回答
使用kotlin-ktx,您可以轻松实现这一点
bindView?.oneTimePasswordTitle?.text = buildSpannedString {
append("One Time Password ")
inSpans(
ForegroundColorSpan(ContextCompat.getColor(bindView?.oneTimePasswordTitle?.context!!,R.color.colorPrimaryText))
){
append(" (As Registered Email)")
}
}
其他回答
这是一个帮助函数。当你有多种语言的时候非常有用!
private void setColor(TextView view, String fulltext, String subtext, int color) {
view.setText(fulltext, TextView.BufferType.SPANNABLE);
Spannable str = (Spannable) view.getText();
int i = fulltext.indexOf(subtext);
str.setSpan(new ForegroundColorSpan(color), i, i + subtext.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
另一个答案将非常相似,但不需要设置TextView的文本两次
TextView TV = (TextView)findViewById(R.id.mytextview01);
Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");
wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TV.setText(wordtoSpan);
我也有同样的问题。 @Dano的回答绝对正确。但这对我没用。 之后,我发现问题,我已经添加ClickableSpan。它会把我的颜色改成另一种颜色(强调色)
问题
当你在ForegroundColorSpan或UnderlineSpan后添加ClickableSpan时,SpannableStringBuilder将不会改变颜色和undline。
解决方案
1. 与ClickableSpan
你可以覆盖ClickableSpan内部的updateDrawState方法。 在updateDrawState方法中,您应该删除超级回调。 之后,你应该根据需要修改你的文本绘制。
2. 没有ClickableSpan
添加ForegroundColorSpan来改变文本颜色 Add UnderlineSpan在文本中添加下划线。
只是补充一个公认的答案,因为所有的答案似乎都在谈论android.graphics.Color only:如果我想要的颜色是在res/values/colors.xml中定义的呢?
例如,考虑colors.xml中定义的材质设计颜色:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="md_blue_500">#2196F3</color>
</resources>
(android_material_design_colors .xml是你最好的朋友)
然后使用contextcompast . getcolor (getContext(), R.color.md_blue_500),在这里您将使用Color。蓝色,所以:
wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
就变成:
wordtoSpan.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.md_blue_500)), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
我发现:
在Android中使用跨度- Michael Spitsin - Medium
从开发人员文档中,更改一个可伸缩对象的颜色和大小:
1-创建类:
class RelativeSizeColorSpan(size: Float,@ColorInt private val color: Int): RelativeSizeSpan(size) {
override fun updateDrawState(textPaint: TextPaint?) {
super.updateDrawState(textPaint)
textPaint?.color = color
}
}
2 .使用该类创建你的spannable:
val spannable = SpannableStringBuilder(titleNames)
spannable.setSpan(
RelativeSizeColorSpan(1.5f, Color.CYAN), // Increase size by 50%
titleNames.length - microbe.name.length, // start
titleNames.length, // end
Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)