TextView tunggal dengan beberapa teks berwarna

167

Seperti judulnya, saya ingin tahu apakah mungkin untuk mencapai dua karakter berwarna berbeda dalam satu elemen tampilan teks.

Andro Selva
sumber
1
Ini bukan duplikat karena penanya meminta warna khusus.
Iqbal
Ada perpustakaan yang bagus untuk ini, saya pikir: blog.stylingandroid.com/rialto-downloadable-fonts github.com/StylingAndroid/Rialto
pengembang android
saya telah menulis beberapa perpustakaan juga yang memiliki perilaku yang mirip dengan ini: github.com/ha-yi/MultiColorTextView
Hayi Nukman

Jawaban:

328

ya, jika Anda memformat properti Stringwith html's font-colorkemudian meneruskannya ke metodeHtml.fromHtml(your text here)

String text = "<font color=#cc0029>First Color</font> <font color=#ffcc00>Second Color</font>";
yourtextview.setText(Html.fromHtml(text));
2red13
sumber
Terima kasih juga membantu saya. +1
Hardik Joshi
10
Jangan lupa untuk melarikan diri menggunakan input pengguna Html.escapeHtml(str).
kelunik
1
Ditambahkan dalam api level 1
2red13
3
Hanya sebuah peringatan. Saya mengalami masalah ketika saya membutuhkan teks saya dalam huruf besar. Saya menggunakan android: textAllCaps = "true" dalam XML dan, pada saat yang sama, memiliki konten HTML saya dalam huruf besar. Itu tidak bekerja. Saya menghapus atribut XML dan sekarang berfungsi dengan baik. Hati-hati, karena jika Anda menggunakan setAllCaps () dalam kode, masalah yang sama akan muncul.
joao2fast4u
5
Html.fromHtml(String)sekarang sudah ditinggalkan, alih-alih gunakan Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY). Informasi lebih lanjut dapat ditemukan di sini.
JediBurrell
165

Anda dapat mencetak garis dengan banyak warna tanpa HTML sebagai:

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);
Swapnil Kotwal
sumber
Hebat, terima kasih, juga bisa melakukan BackgroundColorSpan. ada kesalahan ketik kecil dalam contoh Anda, WordToSpan dan WordtoSpan, catat kasusnya di To
steveh
bagaimana cara unit menguji textview untuk memastikan bahwa teks berakhir dengan Color.RED stackoverflow.com/questions/26611533/…
sudocoder
1
Tidak berfungsi untuk saya mendapatkan `java.lang.StringIndexOutOfBoundsException: length = 3; index = 12`
Muhammad Babar
1
StringIndexOutOfBoundsException sendiri jelas. Anda mengakses string yang melebihi panjangnya.
Swapnil Kotwal
1
String saya tidak diperbaiki, sehingga string akan dihasilkan pada saat aplikasi dijalankan. Saya sudah mencoba hampir semua jawaban dari pertanyaan ini. Tetapi hanya solusi ini yang bekerja untuk saya.
Md. Sabbir Ahmed
33

Anda dapat menggunakan Spannableuntuk menerapkan efek ke TextView:

Berikut adalah contoh saya untuk mewarnai hanya bagian pertama dari sebuah TextViewteks (sambil memungkinkan Anda untuk mengatur warna secara dinamis daripada mengkodekannya menjadi String seperti pada contoh HTML!)

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

Dalam contoh ini Anda dapat mengganti 0xFFFF0000 dengan a getResources().getColor(R.color.red)

Graeme
sumber
1
Jika Anda membutuhkan huruf besar ini, cukup toUpperCase () the Strings.
Graeme
33

Saya telah melakukan ini:

Periksa referensi

Tetapkan Warna pada Teks dengan mengirimkan String dan warna :

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

Tetapkan teks pada TextView / Button / EditText dll dengan memanggil kode di bawah ini:

TextView:

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

Dapatkan String Berwarna:

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

Setel Teks di TextView dari dua string dengan warna berbeda:

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

Selesai

Hiren Patel
sumber
1
nyc satu, tapi HTml.fromHtml sudah ditinggalkan dari API 24
Anuraj R
Anda dapat mengganti panggilan Html.fromHtml("...")dengan panggilan keHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
stkent
31

Gunakan SpannableStringBuilder

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
8

Hai teman-teman saya sudah melakukan ini, cobalah

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

Di dalam kelas TextViewUtils Anda menambahkan metode ini

 /***
 *
 * @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;
}
Abdul Rizwan
sumber
Saya baru saja memperbarui, periksa sekali, ini berfungsi untuk saya.
Abdul Rizwan
Myabe Anda menggunakan Html.fromHtml untuk menggunakan string ini?
Sergey Shustikov
di dalam file string.xml saya telah membuat variabel dan mengatur ini, itu berfungsi untuk saya sekarang saya melakukan ini, bisa tolong beri string Anda di sini.
Abdul Rizwan
5

Lebih baik menggunakan string dalam file string, karena itu:

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

Pemakaian:

textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)
pengembang android
sumber
4

Saya telah menulis beberapa kode untuk pertanyaan lain yang mirip dengan yang satu ini, tetapi pertanyaan itu digandakan jadi saya tidak bisa menjawabnya di sana jadi saya hanya meletakkan kode saya di sini jika seseorang mencari persyaratan yang sama.

Ini bukan kode yang sepenuhnya berfungsi, Anda perlu membuat beberapa perubahan kecil untuk membuatnya berfungsi.

Ini kodenya:

Saya telah menggunakan gagasan @Graeme tentang penggunaan teks yang dapat dipindai.

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

Metode Warna Acak:

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

Coba ini:

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

Gunakan kelas SpannableBuilder alih-alih pemformatan HTML jika memungkinkan karena lebih cepat daripada parsing format HTML. Lihat tolok ukur saya sendiri "SpannableBuilder vs HTML" di Github Terima kasih!

Shuba Anatoliy
sumber
1

Jawaban yang luar biasa! Saya bisa menggunakan Spannable untuk membangun teks berwarna pelangi (jadi ini bisa diulang untuk setiap array warna). Inilah metode saya, jika itu membantu siapa pun:

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

Dan kemudian saya hanya setText (buildRainboxText (pack_name)); Perhatikan bahwa semua kata yang saya masukkan di bawah 15 karakter dan ini hanya mengulangi 5 warna 3 kali - Anda ingin menyesuaikan warna / panjang array untuk penggunaan Anda!

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

untuk 24 API dan lainnya (bendera)

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;

Info lebih lanjut

Ahmad Aghazadeh
sumber
1

Karena API 24 Anda memiliki FROM_HTML_OPTION_USE_CSS_COLORS sehingga Anda dapat menentukan warna dalam CSS alih-alih mengulanginya sepanjang waktu dengan font color=" Jauh lebih jelas - ketika Anda memiliki beberapa html dan Anda ingin menyorot beberapa tag yang telah ditentukan - Anda hanya perlu menambahkan fragmen CSS di atas html Anda

Filipkowicz
sumber
0

25 Juni 2020 oleh @canerkaseler

Saya ingin membagikan Kotlin Answer :

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
}

Setelah itu, panggil fungsi di atas. Anda dapat menelepon lebih dari satu:

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

Output: Anda dapat melihat garis bawah dan warna yang berbeda satu sama lain.

@canerkaseler

canerkaseler
sumber