TextView'da bir kelimenin metin rengini değiştirme


98

Bir tek kelimenin bir metnin rengini değiştirmek için bir yol arıyorum TextViewbir içinden Activity.

Örneğin, bununla:

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

nextMetnin rengini kırmızıya nasıl değiştiririm ?




Yanıtlar:


176

Bildiğim en kolay yol sadece html kullanmak.

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

Ancak bu, rengi değiştirmek istediğinizde (eğer?) TextView'i yeniden oluşturmanızı gerektirir, bu da bir güçlük yaratabilir.


1
Bu kesinlikle en basit yoldur, ancak renk renk = '# EE0000' olmamalı, onaltılık bir rengi belirtmek için pound sembolüne ihtiyaç vardır.
Tom

Düzeltildi, teşekkürler! Bunu gerçek koddan mı yoksa renk oluşturucu bir web sitesiyle bellekten mi kopyaladığımı hatırlamıyorum, bu yüzden daha önce çalışmamış olabilir.
Dan

Tamam sadece emin ol! Ayrıca, 8 basamaklı onaltılık kodları kullanamayacağınızı öğrendiğim gibi, alfa bileşeni yok. Bu beni bir an şaşırttı.
Tom

Kullanımı fromHtmlartık kullanımdan kaldırıldı
Alex Jolig

Html.fromHtmlkullanımdan kaldırıldı. Bu çözüm benim için çalıştı!
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);

spannable kullanmak zorundasınız, bu aynı zamanda bazı metinlerin boyutunu artırmanıza, kalınlaştırmanıza vb. izin verir.


4
Güzel cevap, teşekkürler. Bu durumda, "start + next.length ()" yerine "s.length ()" kullanılabilir: int end = s.length ();
Oleg

1
Xamarin.Android Çözümü arayan herkes durumunda. Kontrolünüzün Özelliğini SpannableStringkullanarak nesne atayabilirsiniz TextFormatted.
Jamshaid Kamran

Bu işe yaramadı. BK'nin çözümüyle sona erdi.
2b77bee6-5445-4c77-b1eb-4df3e5

1. bir yapı varsa, onu kullanmak her zaman daha iyidir. 2. sizin için ne işe yaramadı? bu çözüm eski, çok eski, bazı apiler değişti, eklendi, kaldırıldı, hata düzeltildi, tam olarak ne işe yaramadı?
codeScriber

2
Ben olsun java.lang.String cannot be cast to android.text.Spannablehatayı.
lashgar

38

SpannableStringBuilder'ı şu şekilde kullanın:

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

new ForegroundColorSpan(Color)Metnin orijinal varsayılan rengini korumasını sağlamak için değiştirebileceğim bir şey var mı ?
cjnash

Metin görünümünün ortasına düz metin (Dize) nasıl eklenir?
Ragavendra M

5

uzun ip için bunu kullanabilirsiniz:

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

3

StringBir TextViewmetnin içindeki belirli bir örneğinin tüm örneklerinin durumunu değiştirmek istiyorsanız (büyük / küçük harfe duyarlı değildir) StringBuilders kullanabilirsiniz ve bunun SpannableStringgibi:

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

}

  • Tüm TextViewmetni bir StringBuilder.
  • Aranan dizeyi bir StringBuilder.
  • Tüm TextViewmetni birSpannableString
  • Metnin Stringiçindeki tüm örnekleri bulmak TextViewve ulaşıldığında değiştirmek için basit bir işlem yapın .
  • Metin değerini ayarlayın TextViewiçin SpannableString.

1

Kotlin'de kendi kullanım durumum için ve belki başkası için faydalı bir yardımcı program işlevi uyguladım.

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

Nasıl kullanıyorum:

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

1

KULLANIM:

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

İşlev:

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

Sanırım bu, bir dizedeki bir kelimeyi renklendirmek için daha okunabilir, aynı zamanda muhtemelen biraz daha verimli çünkü bir kez yazıyorsun

    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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.