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?

penghancur sereal
sumber
1
Kemungkinan duplikat dari Apakah mungkin memiliki banyak gaya di dalam TextView?
blahdiblah
stackoverflow.com/questions/9754076/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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.

Dan
sumber
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.

codeScriber
sumber
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);
Biswajit Karmakar
sumber
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));
Maysam R
sumber
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.
Tuhan
sumber
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))
    }
Wahib Ul Haq
sumber
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);
}
Ketan Ramani
sumber
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);
sivi
sumber