Ubah warna teks dari satu kata dalam TextView


98

Saya mencari cara untuk mengubah warna teks dari satu kata dalam a TextViewdari dalam Activity.

Misalnya dengan ini:

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

Bagaimana cara mengubah warna nextteks menjadi merah?




Jawaban:


174

Cara termudah yang saya tahu adalah dengan hanya menggunakan html.

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

Tetapi ini akan mengharuskan Anda untuk membangun kembali TextView ketika (jika?) Anda ingin mengubah warna, yang dapat menyebabkan kerumitan.


1
Ini jelas merupakan cara termudah tetapi seharusnya color be color = '# EE0000' simbol pound diperlukan untuk menunjukkan warna heksadesimal.
Tom

Diperbaiki, terima kasih! Saya tidak ingat apakah saya menyalin ini dari kode sebenarnya atau dari memori dengan situs web penghasil warna sehingga mungkin tidak berfungsi sebelumnya.
Dan

Oke, pastikan saja! Juga, karena saya menemukan Anda tidak dapat menggunakan kode hex 8 digit jadi tidak ada komponen alfa. Yang itu membuatku bingung sejenak.
Tom

Penggunaan fromHtmlsudah tidak digunakan lagi sekarang
Alex Jolig

Html.fromHtmlsudah ditinggalkan. Solusi ini berhasil untuk saya!
coderpc

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

Anda harus menggunakan spannable ini juga akan memungkinkan Anda untuk meningkatkan beberapa ukuran teks, membuatnya tebal dll .... bahkan memasukkan beberapa gambar.


4
Jawaban bagus, terima kasih. Dalam hal ini "s.length ()" dapat digunakan sebagai pengganti "start + next.length ()": int end = s.length ();
Oleg

1
Jika ada yang mencari Xamarin.Android Solution. Anda dapat menetapkan SpannableStringobjek dengan menggunakan TextFormattedProperti kontrol Anda.
Jamshaid Kamran

Tidak bisa membuatnya bekerja. Akhirnya pergi dengan solusi BK.
2b77bee6-5445-4c77-b1eb-4df3e5

1. jika ada yang membangun selalu lebih baik menggunakannya. 2. apa yang tidak berhasil untukmu? solusi ini sudah tua, sangat tua, beberapa API telah berubah, ditambahkan, dihapus, bug diperbaiki, apa sebenarnya yang gagal berfungsi?
codeScriber

2
Saya mendapatkan java.lang.String cannot be cast to android.text.Spannablekesalahan.
lashgar

38

Gunakan SpannableStringBuilder seperti ini:

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

Apakah ada sesuatu yang bisa saya ganti new ForegroundColorSpan(Color)untuk membuat teks mempertahankan warna default aslinya?
cjnash

Bagaimana cara menambahkan teks biasa (String) di tengah textview?
Ragavendra M

5

untuk string panjang Anda bisa menggunakan ini:

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

2

Jika Anda ingin mengubah status semua instance tertentu Stringdi dalam TextViewteks (case insensitive), Anda dapat menggunakan StringBuilders dan SpannableStringseperti ini:

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

}

  • Simpan seluruh TextViewteks di dalam aStringBuilder .
  • Simpan string yang dicari di dalam a StringBuilder.
  • Simpan TextViewteks utuh di dalam aSpannableString
  • Lakukan operasi sederhana untuk menemukan semua Stringcontoh di dalam TextViewteks dan mengubahnya saat tercapai.
  • Setel nilai teks TextViewke SpannableString.

1

Saya mengimplementasikan fungsi utilitas di Kotlin untuk kasus penggunaan saya sendiri dan mungkin berguna untuk orang lain.

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

Bagaimana saya menggunakannya:

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

1

MENGGUNAKAN:

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

Fungsi:

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

Saya pikir ini lebih mudah dibaca untuk mewarnai sebuah kata dalam sebuah string, itu juga mungkin lebih efisien karena Anda menulis sekali

    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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.