Birden çok renkli metin içeren tek TextView


169

Başlıktan da anlaşılacağı gibi, tek bir metin görünümü öğesinde iki farklı renkli karakter elde etmenin mümkün olup olmadığını bilmek istiyorum.



1
Asker özellikle renk istediği için kopya değil.
İkbal


ben de buna benzer davranışa sahip bazı kütüphane yazdım: github.com/ha-yi/MultiColorTextView
Hayi Nukman

Yanıtlar:


329

Biçimlendirmek eğer evet Stringile htmlbireyin font-colormülkiyet sonra yöntemine geçmekHtml.fromHtml(your text here)

String text = "<font color=#cc0029>First Color</font> <font color=#ffcc00>Second Color</font>";
yourtextview.setText(Html.fromHtml(text));

Benim için de teşekkürler. +1
Hardik Joshi

10
Kullanarak girişten kaçmayı unutmayın Html.escapeHtml(str).
kelunik

1
API seviye 1
2'e eklendi13

3
Sadece bir uyarı. Metnimin büyük harf olması gerektiğinde sorun yaşıyordum. XML'de android: textAllCaps = "true" kullanıyordum ve aynı zamanda HTML içeriğimi büyük harfle yazdım. Çalışmıyordu. XML özniteliğini kaldırdım ve şimdi iyi çalışıyor. Dikkatli olun, çünkü kodda setAllCaps () kullanırsanız aynı sorun ortaya çıkacaktır.
joao2fast4u

5
Html.fromHtml(String)artık kullanımdan kaldırıldı, bunun yerine kullanın Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY). Daha fazla bilgiyi burada bulabilirsiniz.
JediBurrell

165

HTML olmadan birden fazla renk içeren satırları aşağıdaki gibi yazdırabilirsiniz:

TextView textView = (TextView) findViewById(R.id.mytextview01);
Spannable word = new SpannableString("Your message");        

word.setSpan(new ForegroundColorSpan(Color.BLUE), 0, word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

textView.setText(word);
Spannable wordTwo = new SpannableString("Your new message");        

wordTwo.setSpan(new ForegroundColorSpan(Color.RED), 0, wordTwo.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(wordTwo);

harika, teşekkürler, ayrıca BackgroundColorSpan yapabilirsiniz. örneğinizde küçük bir yazım hatası var, WordToSpan ve WordtoSpan, To ile ilgili davayı not edin
steveh

metnin Color.RED'de sona erdiğinden emin olmak için metin görünümünü test eden birime nasıl gideriz.RED stackoverflow.com/questions/26611533/…
sudocoder

1
`Java.lang.StringIndexOutOfBoundsException almadığım için çalışmıyor: length = 3; index = 12`
Muhammed Babar

1
StringIndexOutOfBoundsException'ın kendisi açıklayıcı. Dizenin uzunluğunun ötesine erişiyorsunuz.
Swapnil Kotwal

1
Dizelerim düzeltilmedi, bu nedenle dizeler uygulamanın çalışma zamanında oluşturulacaktı. Bu sorunun neredeyse tüm cevaplarını denedim. Ama sadece bu çözüm benim için çalıştı.
Md. Sabbir Ahmed

33

Aşağıdakilere Spannableefekt uygulamak için kullanabilirsiniz TextView:

İşte bir TextViewmetnin sadece ilk kısmını renklendirmek için benim örneğim (HTML örneğinde olduğu gibi rengi bir String'e kodlamak yerine dinamik olarak ayarlamanıza izin verirken!)

    mTextView.setText("Red text is here", BufferType.SPANNABLE);
    Spannable span = (Spannable) mTextView.getText();
    span.setSpan(new ForegroundColorSpan(0xFFFF0000), 0, "Red".length(),
             Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

Bu örnekte 0xFFFF0000'ü bir getResources().getColor(R.color.red)


1
Bu büyük harfe ihtiyacınız varsa, sadece Dizeleri toUpperCase () kullanın.
Graeme

33

Bu şekilde yaptım:

Referansı kontrol et

Takım Renk üzerinde Metin tarafından Dize geçen ve renk :

private String getColoredSpanned(String text, String color) {
    String input = "<font color=" + color + ">" + text + "</font>";
    return input;
}

Küme metin üzerinde TextView / Düğme / EditText kodunun altına arayarak vb:

Metin görünümü:

TextView txtView = (TextView)findViewById(R.id.txtView);

Renkli Dize Alın:

String name = getColoredSpanned("Hiren", "#800000");
String surName = getColoredSpanned("Patel","#000080");

TextView üzerinde Metin Ayarla Farklı renkteki iki dizenin metni:

txtView.setText(Html.fromHtml(name+" "+surName));

Bitti


1
nyc one, ancak HTml.fromHtml API 24'ten kaldırıldı
Anuraj R

Sen çağrıları yerini alabilir Html.fromHtml("...")çağrıları ileHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
stkent

31

SpannableStringBuilder Kullan

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

8

Hey çocuklar bunu yaptım, dene

TextView textView=(TextView)findViewById(R.id.yourTextView);//init

//here I am appending two string into my textView with two diff colors.
//I have done from fragment so I used here getActivity(), 
//If you are trying it from Activity then pass className.this or this; 

textView.append(TextViewUtils.getColoredString(getString(R.string.preString),ContextCompat.getColor(getActivity(),R.color.firstColor)));
textView.append(TextViewUtils.getColoredString(getString(R.string.postString),ContextCompat.getColor(getActivity(),R.color.secondColor)));

İçinizde TextViewUtils sınıfı bu yöntemi ekleyin

 /***
 *
 * @param mString this will setup to your textView
 * @param colorId  text will fill with this color.
 * @return string with color, it will append to textView.
 */
public static Spannable getColoredString(String mString, int colorId) {
    Spannable spannable = new SpannableString(mString);
    spannable.setSpan(new ForegroundColorSpan(colorId), 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    Log.d(TAG,spannable.toString());
    return spannable;
}

Şimdi güncelledim, bir kez kontrol et, benim için çalışıyor.
Abdul Rizwan

Bu dizeyi kullanmak için Html.fromHtml kullanıyorsunuz?
Sergey Shustikov

string.xml dosyasında değişken oluşturdum ve bunu ayarladım, şimdi benim için çalışıyor, bunu yapıyorum, lütfen dizenizi buraya verebilir misiniz?
Abdul Rizwan

5

Dizeyi dizeler dosyasında kullanmak daha iyidir:

    <string name="some_text">
<![CDATA[
normal color <font color=\'#06a7eb\'>special color</font>]]>
    </string>

Kullanımı:

textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)

4

Ben buna benzer başka bir soru için bazı kod yazmak var, ama bu soru çoğaltıldı, bu yüzden ben orada cevap veremem, bu yüzden birisi aynı gereksinimi arayan sadece burada kodumu koyuyorum.

Tam olarak çalışma kodu değil, çalışmasını sağlamak için bazı küçük değişiklikler yapmanız gerekir.

İşte kod:

@Graeme fikrini;

String colorfulText = "colorfulText";       
    Spannable span = new SpannableString(colorfulText);             

    for ( int i = 0, len = colorfulText.length(); i < len; i++ ){
        span.setSpan(new ForegroundColorSpan(getRandomColor()), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);                     
    }   

    ((TextView)findViewById(R.id.txtSplashscreenCopywrite)).setText(span);

Rastgele Renk Yöntemi:

  private int getRandomColor(){
        Random rnd = new Random();
        return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
    }

2

Bunu dene:

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
      "<small>" + description + "</small>" + "<br />" + 
      "<small>" + DateAdded + "</small>"));

2

HTML biçimi ayrıştırmasından daha hızlı olduğu için mümkün olan yerlerde HTML biçimlendirme yerine SpannableBuilder sınıfını kullanın. Üzerinde kendi kriter "HTML vs SpannableBuilder" Bkz Github teşekkür!


1

Müthiş cevaplar! Spannable'ı gökkuşağı renkli metin oluşturmak için kullanabildim (bu, herhangi bir renk dizisi için tekrarlanabilir). İşte benim yöntem, eğer herkese yardımcı olur:

private Spannable buildRainbowText(String pack_name) {
        int[] colors = new int[]{Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE};
        Spannable word = new SpannableString(pack_name);
        for(int i = 0; i < word.length(); i++) {
            word.setSpan(new ForegroundColorSpan(colors[i]), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return word;
    }

Ve sonra ben sadece setText (buildRainboxText (paket_adı)); Geçtiğim tüm kelimelerin 15 karakterin altında olduğunu ve bu sadece 5 rengi 3 kez tekrarladığını unutmayın - kullanımınız için dizinin renklerini / uzunluğunu ayarlamak istersiniz!


1
if (Build.VERSION.SDK_INT >= 24) {
     Html.fromHtml(String, flag) // for 24 API  and more
 } else {
     Html.fromHtml(String) // or for older API 
 }

24 API ve daha fazlası için (işaret)

public static final int FROM_HTML_MODE_COMPACT = 63;
public static final int FROM_HTML_MODE_LEGACY = 0;
public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1;
public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0;
public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1;

Daha fazla bilgi


1

API 24'ten beri FROM_HTML_OPTION_USE_CSS_COLORS'a sahipsiniz, böylece CSS'de renkleri her zaman tekrarlamak yerine font color=" çok daha net bir şekilde tanımlayabilirsiniz - bazı html'leriniz varsa ve bazı önceden tanımlanmış etiketleri vurgulamak istediğinizde - html'nizin üstüne CSS parçası eklemeniz yeterlidir


0

25 Haziran 2020 @canerkaseler

Kotlin Cevap paylaşmak istiyorum :

fun setTextColor(tv:TextView, startPosition:Int, endPosition:Int, color:Int){
    val spannableStr = SpannableString(tv.text)

    val underlineSpan = UnderlineSpan()
    spannableStr.setSpan(
        underlineSpan,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    val backgroundColorSpan = ForegroundColorSpan(this.resources.getColor(R.color.agreement_color))
    spannableStr.setSpan(
        backgroundColorSpan,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    val styleSpanItalic = StyleSpan(Typeface.BOLD)
    spannableStr.setSpan(
        styleSpanItalic,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    tv.text = spannableStr
}

Sonra yukarıdaki işlevi çağırın. Birden fazla kişiyi arayabilirsiniz:

setTextColor(textView, 0, 61, R.color.agreement_color)
setTextColor(textView, 65, 75, R.color.colorPrimary)

Çıktı: Altı çizili ve farklı renkleri birbirinizle görebilirsiniz.

@canerkaseler

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.