我想做类似于Twitter应用程序的操作,其中一部分文本为蓝色。参见下图:
(来源:twimg.com)
#1 楼
另一个答案将非常相似,但不需要两次设置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);
#2 楼
这是一个小帮助功能。非常适合当您使用多种语言时!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);
}
#3 楼
在尝试理解新概念时,我总是会发现一些直观的示例。背景色
前景颜色
SpannableString spannableString = new SpannableString("Hello World!");
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(backgroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
组合
SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
进一步研究
解释Span标志的含义,例如SPAN_EXCLUSIVE_EXCLUSIVE
Android Spanned,SpannedString,Spannable,SpannableString和CharSequence
#4 楼
如果需要更多控制,则可能需要检查TextPaint
类。使用方法如下:final ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(final View textView) {
//Your onClick code here
}
@Override
public void updateDrawState(final TextPaint textPaint) {
textPaint.setColor(yourContext.getResources().getColor(R.color.orange));
textPaint.setUnderlineText(true);
}
};
评论
getColor(int id)在Android 6.0棉花糖(API 23)stackoverflow.com/questions/31590714/…上已弃用
– Eka putra
17年12月6日在5:04
单击侦听器的不错答案。
– Muhaiminur Rahman
19年6月12日在11:45
#5 楼
设置您的TextView
的文本可扩展,并为您的文本定义一个ForegroundColorSpan
。TextView textView = (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);
textView.setText(wordtoSpan);
评论
谢谢!是否可以在不先将文本分配给TextView的情况下执行此操作?
–hpique
2010年7月19日在17:02
我没有很好地解释自己。让我改一下。前三行是否必要?您不能直接从字符串创建Spannable对象吗?
–hpique
2010年7月19日在21:18
不,您必须将TextView的文本存储到Buffer Spannable中以更改前景色。
– Jorgesys
2010年7月20日,0:47
我想对颜色做同样的事情,除了颜色部分,我希望所有内容都加粗,该部分我要为斜体,我该怎么做?
– Lukap
2011年7月2日于16:34
如何设置点击范围?
– Rishabh Srivastava
15年8月7日在8:54
#6 楼
在某些情况下可以使用的另一种方法是在采用Spannable的视图的属性中设置链接颜色。例如,如果要在TextView中使用Spannable,您可以像这样在XML中设置链接颜色:<TextView
android:id="@+id/myTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorLink="@color/your_color"
</TextView>
还可以在代码中使用以下命令设置链接颜色:
TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setLinkTextColor(your_color);
#7 楼
有一个工厂用于创建Spannable,并避免强制转换,如下所示:Spannable span = Spannable.Factory.getInstance().newSpannable("text");
评论
您能否阐明如何使用SpannableFactory? “文本”应如何显示?
–Piotr
2012年10月3日,10:53
在由SpannableFactory创建Spannable之后,如何使用它?
– MBH
16-09-22在11:42
#8 楼
通过传递字符串和颜色来设置文本的颜色:private String getColoredSpanned(String text, String color) {
String input = "<font color=" + color + ">" + text + "</font>";
return input;
}
通过调用以下代码在TextView / Button / EditText等上设置文本:
TextView :
TextView txtView = (TextView)findViewById(R.id.txtView);
获取彩色字符串:
String name = getColoredSpanned("Hiren", "#800000");
在TextView上设置文本:
txtView.setText(Html.fromHtml(name));
完成
#9 楼
只是添加到已接受的答案中,因为所有答案似乎都只涉及android.graphics.Color
:如果我要的颜色在res/values/colors.xml
中定义了怎么办?例如,考虑在colors.xml
中定义的Material Design颜色:<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="md_blue_500">#2196F3</color>
</resources>
(
android_material_design_colours.xml
是你最好的朋友)然后在要使用
ContextCompat.getColor(getContext(), R.color.md_blue_500)
的地方使用Color.BLUE
,这样: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
#10 楼
String text = "I don't like Hasina.";
textView.setText(spannableString(text, 8, 14));
private SpannableString spannableString(String text, int start, int end) {
SpannableString spannableString = new SpannableString(text);
ColorStateList redColor = new ColorStateList(new int[][]{new int[]{}}, new int[]{0xffa10901});
TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, redColor, null);
spannableString.setSpan(highlightSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new BackgroundColorSpan(0xFFFCFF48), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new RelativeSizeSpan(1.5f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
输出:
评论
你不喜欢Hasina🤣
–阿布·纳耶姆(Abu Nayem)
5月9日10:38
#11 楼
这是我为此提供的Kotlin扩展功能 fun TextView.setColouredSpan(word: String, color: Int) {
val spannableString = SpannableString(text)
val start = text.indexOf(word)
val end = text.indexOf(word) + word.length
try {
spannableString.setSpan(ForegroundColorSpan(color), start, end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
text = spannableString
} catch (e: IndexOutOfBoundsException) {
println("'$word' was not not found in TextView text")
}
}
将文本设置为TextView后使用它,就像这样
private val blueberry by lazy { getColor(R.color.blueberry) }
textViewTip.setColouredSpan("Warning", blueberry)
#12 楼
在ur布局中创建textview
将此代码粘贴到ur MainActivity中
TextView textview=(TextView)findViewById(R.id.textviewid);
Spannable spannable=new SpannableString("Hello my name is sunil");
spannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 5,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textview.setText(spannable);
//Note:- the 0,5 is the size of colour which u want to give the strring
//0,5 means it give colour to starting from h and ending with space i.e.(hello), if you want to change size and colour u can easily
#13 楼
这里的一些答案不是最新的。因为,(在大多数情况下)您将在链接上添加自定义clic操作。此外,如文档帮助所提供的那样,跨字符串链接颜色将具有默认值。
“如果在主题中定义了此属性,则默认的链接颜色是主题的强调色或android:textColorLink”。
这是安全的方法。
private class CustomClickableSpan extends ClickableSpan {
private int color = -1;
public CustomClickableSpan(){
super();
if(getContext() != null) {
color = ContextCompat.getColor(getContext(), R.color.colorPrimaryDark);
}
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
ds.setColor(color != -1 ? color : ds.linkColor);
ds.setUnderlineText(true);
}
@Override
public void onClick(@NonNull View widget) {
}
}
然后使用它。
String text = "my text with action";
hideText= new SpannableString(text);
hideText.setSpan(new CustomClickableSpan(){
@Override
public void onClick(@NonNull View widget) {
// your action here !
}
}, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
yourtextview.setText(hideText);
// don't forget this ! or this will not work !
yourtextview.setMovementMethod(LinkMovementMethod.getInstance());
希望这会很有帮助!
#14 楼
在开发人员文档中,更改跨度的颜色和大小:1-创建一个类:
class RelativeSizeColorSpan(size: Float,@ColorInt private val color: Int): RelativeSizeSpan(size) {
override fun updateDrawState(textPaint: TextPaint?) {
super.updateDrawState(textPaint)
textPaint?.color = color
}
}
2创建跨度使用该类:
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
)
#15 楼
下面对我来说很完美 tvPrivacyPolicy = (TextView) findViewById(R.id.tvPrivacyPolicy);
String originalText = (String)tvPrivacyPolicy.getText();
int startPosition = 15;
int endPosition = 31;
SpannableString spannableStr = new SpannableString(originalText);
UnderlineSpan underlineSpan = new UnderlineSpan();
spannableStr.setSpan(underlineSpan, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
ForegroundColorSpan backgroundColorSpan = new ForegroundColorSpan(Color.BLUE);
spannableStr.setSpan(backgroundColorSpan, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
StyleSpan styleSpanItalic = new StyleSpan(Typeface.BOLD);
spannableStr.setSpan(styleSpanItalic, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tvPrivacyPolicy.setText(spannableStr);
上述代码的输出
评论
但是,如何更改多个文本而不是一个跨度的颜色?
– mostafa hashim
15年11月8日在18:33
@mostafahashim通过重复第3行wordtoSpan.setSpan(new ForegroundColorSpan(Color.RED),50、80,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)创建多个跨度;
–阿什拉夫·阿尔沙哈维(Ashraf Alshahawy)
16年1月5日在7:54
Kotlin + Spannable String解决方案看起来像这样stackoverflow.com/questions/4032676/…
–德米特里·列昂诺夫(Dmitrii Leonov)
1月1日4:29