开发者

How to color part of TextView in android? [duplicate]

开发者 https://www.devze.com 2023-04-03 17:40 出处:网络
This question already has answers here: How can I change the color of a part of a TextView? (18 answers)
This question already has answers here: How can I change the color of a part of a TextView? (18 answers) Closed 7 years ago.

I am trying to change the color of certain words (Search results) in a TextView? I tried to use ANSI colors like this:

text.setText("\u001B31;1m" + "someText"开发者_如何学运维);

but it did not work. How do I achieve this?


this will help u

Spannable WordtoSpan = new SpannableString("I know just how to whisper");        
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 5, 13, 
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(WordtoSpan);


You're looking for TextAppearanceSpan and 'SpannableString' To be more clear workflow is as follow

  1. Create SpannableString from your source String
  2. Create TextAppearanceSpan and set it via call to setSpan method on SpannableString
  3. Call textView.setText method with SpannableString as argument


You can also use HTML like in the following example:

string = "<font color='#FFFFFF'>This is my text </font>" + "<font color='#000000'> Another text </font>";
textView.setText(Html.fromHtml(string));

Without using additional variable (one-line solution):

textView.setText(Html.fromHtml("<font color='#FFFFFF'>This is my text </font>" + "<font color='#000000'> Another text </font>"));

It is quite easy and understandable solution :)


I know I'm a bit late for the party but I think this is going to help future visitors out.

You might wanna set partial text colors on the layout XML instead of using Java code, so based on previous answers on this thread I've created a small class that does the trick.

1 - First let's create our component

package yourpackagehere.component;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;

import yourpackagehere.R;

public class FontSpannableTextView extends TextView {

    public FontSpannableTextView(Context context) {
        super(context);
    }

    public FontSpannableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setColorPartialString(context, attrs);
    }

    public FontSpannableTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setColorPartialString(context, attrs);
    }

    private void setColorPartialString(Context context, AttributeSet attrs) {
        if (isInEditMode()) {
            return;
        }
        String partialText = null;
        int partialTextColor = Integer.MIN_VALUE;

        if (attrs != null) {
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FontSpannableTextView);
            for (int i = 0; i < a.getIndexCount(); i++) {
                int attr = a.getIndex(i);
                switch (attr) {
                    case R.styleable.FontSpannableTextView_fontspannabletextview_partialText:
                        partialText = a.getString(attr);
                        break;
                    case R.styleable.FontSpannableTextView_fontspannabletextview_partialTextColor:
                        partialTextColor = a.getColor(attr, Color.BLACK);
                        break;
                }
            }
            a.recycle();
        }

        if (partialText != null && partialTextColor != Integer.MIN_VALUE) {
            String wholeText = getText().toString();
            Spannable spannable = new SpannableString(wholeText);
            spannable.setSpan(new ForegroundColorSpan(partialTextColor),
                    wholeText.indexOf(partialText),
                    wholeText.indexOf(partialText) + partialText.length(),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            setText(spannable);
        } else {
            Log.e("YOURTAGHERE","You must provide both partialText and partialTextColor values");
        }
    }
}

2 - on attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="FontSpannableTextView">
        <attr name="fontspannabletextview_partialText" format="string" />
        <attr name="fontspannabletextview_partialTextColor" format="color" />
    </declare-styleable>
</resources>

3 - Let's use it in our test layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <yourpackagehere.component.FontSpannableTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" <!-- Hello world! -->
        android:layout_margin="25dp"
        app:fontspannabletextview_partialText="@string/world" <!-- world! -->
        app:fontspannabletextview_partialTextColor="@color/tutorial_yellow"
        android:textSize="40sp"
        />

</LinearLayout>

Example:

How to color part of TextView in android? [duplicate]

0

精彩评论

暂无评论...
验证码 换一张
取 消