在Android中设置TextView span的颜色


206

是否可以在TextView中设置文本范围的颜色?

我想做类似于Twitter应用程序的操作,其中一部分文本为蓝色。见下图:

替代文字
(来源:twimg.com

Answers:


429

另一个答案将非常相似,但不需要设置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);

但是如何更改所有文本而不是一个跨度的多个单词的颜色?
mostafa hashim

1
@mostafahashim通过重复第3行wordtoSpan.setSpan(new ForegroundColorSpan(Color.RED),50、80,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)创建多个跨度;
Ashraf Alshahawy,

科特林+ Spannable字符串的解决方案应该是这样的stackoverflow.com/questions/4032676/...
德米特里·列昂诺夫

81

这是一个小帮助功能。非常适合您使用多种语言时!

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);
}

37

在尝试理解一个新概念时,我总是会发现一些视觉示例会有所帮助。

背景颜色

在此处输入图片说明

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

组合

在此处输入图片说明

SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

进一步研究


29

如果需要更多控制,则可能要检查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/...
依卡太子

单击侦听器的不错答案。
Muhaiminur Ra​​hman

20

设置您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年

我没有很好地解释自己。让我改一下。前三行是否必要?您不能直接从字符串创建Spannable对象吗?
hpique 2010年

不,您必须将TextView的文本存储到Buffer Spannable中才能更改前景色。
Jorgesys

我想对颜色做同样的事情,除了彩色部分,我希望所有内容都加粗,那一部分我要是斜体,我该怎么做?
卢卡普2011年

1
如何设置点击范围?
Rishabh Srivastava 2015年

13

在某些情况下可以使用的另一种方法是在采用Spannable的视图的属性中设置链接颜色。

例如,如果您的Spannable将在TextView中使用,则可以在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);

5

有一个工厂用于创建Spannable,并避免强制转换,如下所示:

Spannable span = Spannable.Factory.getInstance().newSpannable("text");

1
您能否阐明如何使用SpannableFactory?“文本”应如何显示?
Piotr 2012年

在由SpannableFactory创建Spannable之后,如何使用它?
MBH

5

设置颜色文本传递字符串颜色

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

完成了


4
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;
}

输出:

在此处输入图片说明


你不喜欢哈西娜🤣
阿布Nayem

3

只是为了增加接受的答案,因为所有答案似乎android.graphics.Color都只在谈论:如果要定义我想要的颜色怎么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_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);

我在哪里发现:


2

这是我为此提供的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)

0
  1. 在您的布局中创建textview
  2. 将此代码粘贴到您的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

0

下面对我来说很完美

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

以上代码的输出

在此处输入图片说明


0

这里的一些答案不是最新的。因为,在大多数情况下您将在链接上添加自定义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());

希望这对您有很大帮助!


0

从开发人员文档中,更改跨度的颜色和大小:

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
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.