Thay đổi màu văn bản của một từ trong TextView


97

Tôi đang tìm cách để thay đổi màu văn bản của một từ đơn lẻ trong một TextViewtừ trong dấu Activity.

Ví dụ, với điều này:

String first = "This word is ";
String next = "red"
TextView t = (TextView) findViewById(R.id.textbox);
t.setText(first + next);

Làm cách nào để thay đổi màu của nextvăn bản thành màu đỏ?




Câu trả lời:


172

Cách dễ nhất mà tôi biết là chỉ sử dụng html.

String first = "This word is ";
String next = "<font color='#EE0000'>red</font>";
t.setText(Html.fromHtml(first + next));

Nhưng điều này sẽ yêu cầu bạn xây dựng lại TextView khi (nếu?) Bạn muốn thay đổi màu sắc, điều này có thể gây ra rắc rối.


1
Đây chắc chắn là cách đơn giản nhất nhưng không phải là màu = '# EE0000', ký hiệu bảng Anh là cần thiết để biểu thị màu thập lục phân.
Tom

Đã sửa, cảm ơn! Tôi không nhớ là mình đã sao chép mã này từ mã thực hay từ bộ nhớ với trang web tạo màu nên có thể nó đã không hoạt động trước đây.
Dan

Ok chỉ cần đảm bảo! Ngoài ra, như tôi phát hiện ra, bạn không thể sử dụng mã hex 8 chữ số nên không có thành phần alpha. Điều đó làm tôi bối rối trong giây lát.
Tom

Việc sử dụng fromHtmlhiện không còn được dùng nữa
Alex Jolig

Html.fromHtmlkhông được dùng nữa. Giải pháp này đã làm việc cho tôi!
coderpc 27/07/17

74
t.setText(first + next, BufferType.SPANNABLE);
Spannable s = (Spannable)t.getText();
int start = first.length();
int end = start + next.length();
s.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

bạn phải sử dụng spannable, điều này cũng sẽ cho phép bạn tăng kích thước của một số văn bản, làm cho nó đậm, v.v. thậm chí đưa vào một số hình ảnh.


4
Câu trả lời tốt, cảm ơn. Trong trường hợp này, "s.length ()" có thể được dùng thay cho "start + next.length ()": int end = s.length ();
Oleg

1
Trong trường hợp bất kỳ ai đang tìm kiếm Giải pháp Xamarin.Android. Bạn có thể chỉ định SpannableStringđối tượng bằng cách sử dụng TextFormattedThuộc tính kiểm soát của bạn.
Jamshaid Kamran

Không thể làm cho điều này hoạt động. Kết thúc với giải pháp của BK.
2b77bee6-5445-4c77-b1eb-4df3e5

1. nếu có một bản dựng thì tốt hơn hết là sử dụng nó. 2. những gì không làm việc cho bạn? giải pháp này đã cũ, rất cũ, một số apis đã thay đổi, thêm, bớt, sửa lỗi, chính xác là những gì không hoạt động?
codeScriber

2
Tôi nhận java.lang.String cannot be cast to android.text.Spannablelỗi.
lashgar

37

Sử dụng SpannableStringBuilder như thế này:

SpannableStringBuilder builder = new SpannableStringBuilder();

SpannableString str1= new SpannableString("Text1");
str1.setSpan(new ForegroundColorSpan(Color.RED), 0, str1.length(), 0);
builder.append(str1);

SpannableString str2= new SpannableString(appMode.toString());
str2.setSpan(new ForegroundColorSpan(Color.GREEN), 0, str2.length(), 0);
builder.append(str2);

TextView tv = (TextView) view.findViewById(android.R.id.text1);
tv.setText( builder, TextView.BufferType.SPANNABLE);

Có thứ gì tôi có thể thay thế new ForegroundColorSpan(Color)để làm cho văn bản vẫn giữ được màu mặc định ban đầu không?
cjnash

Làm cách nào để thêm văn bản thuần túy (Chuỗi) vào giữa chế độ xem văn bản?
Ragavendra M

5

đối với chuỗi dài, bạn có thể sử dụng cái này:

String help = getString(R.string.help);
help = help.replace("some word", "<font color='#EE0000'>some word</font>");
txtDesc.setText(Html.fromHtml(help));

2

Nếu bạn muốn thay đổi trạng thái của tất cả các trường hợp cụ thể Stringbên trong một TextViewvăn bản (không phân biệt chữ hoa chữ thường), bạn có thể sử dụng StringBuilders và SpannableStringnhư sau:

StringBuilder textBuilder = new StringBuilder(myTextView.getText().toString());
StringBuilder searchedTextBuilder = new StringBuilder((mySearchedString));
SpannableString spannableString = new SpannableString(myTextView.getText().toString());

int counter = 0;
int index = 0;

for (int i = 0;i < textBuilder.length() - mySearchedString.length() - 1;i++)
{
    counter = 0;
    if (Character.toLowerCase(textBuilder.charAt(i)) == Character.toLowerCase(searchedTextBuilder.charAt(index)))
    {
        counter++;
        index++;
        for (int j = 1,z = i + 1;j < mySearchedString.length() - 1;j++,z++)
        {
            if (Character.toLowerCase(textBuilder .charAt(z)) == Character.toLowerCase(searchedTextBuilder .charAt(index)))
            {
                counter++;
                index++;
            }
            else
            {
                index++;
                if (index % mySearchedString.length() == 0)
                {
                    index = 0;
                }
                break;
             }
        }
        if (counter == mySearchedString.length() - 1) // A match
        {
            spannableString.setSpan(new ForegroundColorSpan(Color.RED), i,
                                i + mySearchedString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Do the change you want(In this case changing the fore ground color to red)
            index = 0;
            continue;
        }
        else
        {
            index = 0;
            continue;
        }
    }
}
myTextView.setText(spannableString);

}

  • Lưu trữ toàn bộ TextViewvăn bản bên trong a StringBuilder.
  • Lưu trữ chuỗi đã tìm kiếm bên trong a StringBuilder.
  • Lưu trữ TextViewvăn bản điếm bên trongSpannableString
  • Thực hiện một thao tác đơn giản để tìm tất cả các Stringthể hiện bên trong TextViewvăn bản và thay đổi chúng khi đạt được.
  • Đặt giá trị văn bản của TextViewthành SpannableString.

1

Tôi đã triển khai một chức năng tiện ích trong Kotlin cho usecase của riêng mình và có thể hữu ích cho người khác.

fun getCusomTextWithSpecificTextWithDiffColor(textToBold: String, fullText: String,
                                                  targetColor: Int) =
            SpannableStringBuilder(fullText).apply {
                setSpan(ForegroundColorSpan(targetColor),
                        fullText.indexOf(textToBold),
                        (fullText.indexOf(textToBold) + textToBold.length),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }

Cách tôi đang sử dụng nó:

context?.let {
        infoMessage.text = AppUtils.getCusomTextWithSpecificTextWithDiffColor(
                wordAsBold,
                completeSentence, ContextCompat.getColor(it, R.color.white))
    }

1

SỬ DỤNG:

makeTextBold("Your order is accepted","accepted", textView);
makeTextBold("Your order is canceled","canceled", textView);

Chức năng:

public static void makeTextBold(String sentence, String word, AppCompatTextView textView) {
    SpannableStringBuilder builder = new SpannableStringBuilder();
    int startIndex = sentence.indexOf(word.toLowerCase().trim());
    int endIndex = startIndex + word.toLowerCase().trim().length();
    SpannableString spannableString = new SpannableString(sentence);
    StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
    spannableString.setSpan(boldSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To make text Bold
    spannableString.setSpan(new ForegroundColorSpan(Color.RED), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To change color of text
    builder.append(spannableString);
    textView.setText(builder, TextView.BufferType.SPANNABLE);
}

0

Tôi nghĩ điều này dễ đọc hơn để tô màu một từ trong chuỗi, nó cũng có thể hiệu quả hơn một chút vì bạn viết một lần

    String str  = YOUR_STRING
    Spannable s = new SpannableString(str);
    int start = str.indexOf(err_word_origin);
    int end =  start + err_word_origin.length();
    s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    YOUR_TEXT_VIEW.setText(s , TextView.BufferType.SPANNABLE);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.