Setel warna rentang TextView di Android


206

Apakah mungkin untuk mengatur warna rentang teks saja di TextView?

Saya ingin melakukan sesuatu yang mirip dengan aplikasi Twitter, di mana sebagian teksnya berwarna biru. Lihat gambar di bawah ini:

teks alternatif
(sumber: twimg.com )

Jawaban:


430

Jawaban lain akan sangat mirip, tetapi tidak perlu mengatur teks TextViewdua kali

TextView TV = (TextView)findViewById(R.id.mytextview01);

Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");        

wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

TV.setText(wordtoSpan);

tetapi bagaimana saya bisa mengubah warna untuk beberapa kata saya semua teks tidak satu rentang?
mostafa hashim

1
@mostafahashim membuat banyak bentang dengan mengulangi baris 3 wordtoSpan.setSpan (ForegroundColorSpan baru (Color.RED), 50, 80, Dapat Diputar.SPAN_EXCLUSIVE_EXCLUSIVE);
Ashraf Alshahawy

Solusi Kotlin + Spannable String akan terlihat seperti ini stackoverflow.com/questions/4032676/…
Dmitrii Leonov

82

Berikut ini sedikit fungsi bantuan. Bagus untuk ketika Anda memiliki banyak bahasa!

private void setColor(TextView view, String fulltext, String subtext, int color) {
    view.setText(fulltext, TextView.BufferType.SPANNABLE);
    Spannable str = (Spannable) view.getText();
    int i = fulltext.indexOf(subtext);
    str.setSpan(new ForegroundColorSpan(color), i, i + subtext.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}

38

Saya selalu menemukan contoh visual yang membantu ketika mencoba memahami konsep baru.

Warna latar belakang

masukkan deskripsi gambar di sini

SpannableString spannableString = new SpannableString("Hello World!");
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(backgroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

Warna latar depan

masukkan deskripsi gambar di sini

SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

Kombinasi

masukkan deskripsi gambar di sini

SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

Pelajaran lanjutan


30

Jika Anda ingin lebih banyak kontrol, Anda mungkin ingin memeriksa TextPaintkelas. Berikut cara menggunakannya:

final ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(final View textView) {
        //Your onClick code here
    }

    @Override
    public void updateDrawState(final TextPaint textPaint) {
        textPaint.setColor(yourContext.getResources().getColor(R.color.orange));
        textPaint.setUnderlineText(true);
    }
};

getColor (int id) sudah tidak digunakan lagi di Android 6.0 Marshmallow (API 23) stackoverflow.com/questions/31590714/…
Eka putra

Jawaban Bagus Dengan Klik Pendengar.
Muhaiminur Rahman

20

Tetapkan TextViewteks Anda dapat dipindai dan tentukan a ForegroundColorSpanuntuk teks Anda.

TextView textView = (TextView)findViewById(R.id.mytextview01);    
Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");          
wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
textView.setText(wordtoSpan);

Terima kasih! Apakah mungkin untuk melakukan ini tanpa menetapkan teks ke TextView terlebih dahulu?
hpique

Saya tidak menjelaskan diri saya dengan baik. Biarkan saya ulangi. Apakah 3 baris pertama diperlukan? Tidak bisakah Anda membuat objek Spannable dari string secara langsung?
hpique

Tidak, Anda harus menyimpan teks TextView Anda ke dalam Buffer Spannable untuk mengubah warna latar depan.
Jorgesys

Saya ingin ke hal yang sama dengan warna plus saya ingin semuanya menjadi berani kecuali bagian berwarna, bagian yang saya ingin menjadi Italia, bagaimana saya bisa melakukan itu?
Lukap

1
cara mengatur klik dalam rentang?
Rishabh Srivastava

14

Cara lain yang dapat digunakan dalam beberapa situasi adalah dengan mengatur warna tautan pada properti tampilan yang menggunakan Spannable.

Jika Spannable Anda akan digunakan dalam TextView, misalnya, Anda dapat mengatur warna tautan dalam XML seperti ini:

<TextView
    android:id="@+id/myTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColorLink="@color/your_color"
</TextView>

Anda juga dapat mengaturnya dalam kode dengan:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setLinkTextColor(your_color);

6

Ada pabrik untuk membuat Spannable, dan hindari para pemain, seperti ini:

Spannable span = Spannable.Factory.getInstance().newSpannable("text");

1
Bisakah Anda memperjelas cara menggunakan SpannableFactory? Bagaimana "teks" seharusnya terlihat?
Piotr

setelah membuat Spannable oleh SpannableFactory, jadi bagaimana menggunakannya?
MBH

6

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

Setel Teks di TextView:

txtView.setText(Html.fromHtml(name));

Selesai


5
String text = "I don't like Hasina.";
textView.setText(spannableString(text, 8, 14));

private SpannableString spannableString(String text, int start, int end) {
    SpannableString spannableString = new SpannableString(text);
    ColorStateList redColor = new ColorStateList(new int[][]{new int[]{}}, new int[]{0xffa10901});
    TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, redColor, null);

    spannableString.setSpan(highlightSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(new BackgroundColorSpan(0xFFFCFF48), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(new RelativeSizeSpan(1.5f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    return spannableString;
}

Keluaran:

masukkan deskripsi gambar di sini


Anda tidak suka Hasina 🤣
Abu Nayem

4

Hanya untuk menambah jawaban yang diterima, karena semua jawaban tampaknya android.graphics.Colorhanya berbicara tentang : bagaimana jika warna yang saya inginkan didefinisikan res/values/colors.xml?

Misalnya, pertimbangkan warna Desain Bahan yang didefinisikan dalam colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="md_blue_500">#2196F3</color>
</resources>

( android_material_design_colours.xmladalah teman terbaikmu)

Kemudian gunakan ContextCompat.getColor(getContext(), R.color.md_blue_500)tempat yang akan Anda gunakan Color.BLUE, sehingga:

wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

menjadi:

wordtoSpan.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.md_blue_500)), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Di mana saya menemukan itu:


3

Inilah Fungsi Ekstensi Kotlin yang saya miliki untuk ini

    fun TextView.setColouredSpan(word: String, color: Int) {
        val spannableString = SpannableString(text)
        val start = text.indexOf(word)
        val end = text.indexOf(word) + word.length
        try {
            spannableString.setSpan(ForegroundColorSpan(color), start, end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            text = spannableString
        } catch (e: IndexOutOfBoundsException) {
         println("'$word' was not not found in TextView text")
    }
}

Gunakan setelah Anda mengatur teks Anda ke TextView seperti itu

private val blueberry by lazy { getColor(R.color.blueberry) }

textViewTip.setColouredSpan("Warning", blueberry)

1
  1. buat tampilan teks di tata letak Anda
  2. rekatkan kode ini di MainActivity Anda

    TextView textview=(TextView)findViewById(R.id.textviewid);
    Spannable spannable=new SpannableString("Hello my name is sunil");
    spannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 5, 
    Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    textview.setText(spannable);
    //Note:- the 0,5 is the size of colour which u want to give the strring
    //0,5 means it give colour to starting from h and ending with space i.e.(hello), if you want to change size and colour u can easily

1

Di bawah ini berfungsi dengan baik untuk saya

    tvPrivacyPolicy = (TextView) findViewById(R.id.tvPrivacyPolicy);
    String originalText = (String)tvPrivacyPolicy.getText();
    int startPosition = 15;
    int endPosition = 31;

    SpannableString spannableStr = new SpannableString(originalText);
    UnderlineSpan underlineSpan = new UnderlineSpan();
    spannableStr.setSpan(underlineSpan, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    ForegroundColorSpan backgroundColorSpan = new ForegroundColorSpan(Color.BLUE);
    spannableStr.setSpan(backgroundColorSpan, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    StyleSpan styleSpanItalic  = new StyleSpan(Typeface.BOLD);

    spannableStr.setSpan(styleSpanItalic, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    tvPrivacyPolicy.setText(spannableStr);

Output untuk kode di atas

masukkan deskripsi gambar di sini


1

Beberapa jawaban di sini tidak terkini. Karena, Anda akan (dalam sebagian besar kasus) menambahkan tindakan klik kustom pada tautan Anda .

Selain itu, seperti yang disediakan oleh bantuan dokumentasi, warna tautan tali yang direntang akan memiliki warna default. "Warna tautan default adalah warna aksen tema atau android: textColorLink jika atribut ini didefinisikan dalam tema".

Inilah cara untuk melakukannya dengan aman.

 private class CustomClickableSpan extends ClickableSpan {

    private int color = -1;

    public CustomClickableSpan(){
        super();
        if(getContext() != null) {
            color = ContextCompat.getColor(getContext(), R.color.colorPrimaryDark);
        }
    }

    @Override
    public void updateDrawState(@NonNull TextPaint ds) {
        ds.setColor(color != -1 ? color : ds.linkColor);
        ds.setUnderlineText(true);
    }

    @Override
    public void onClick(@NonNull View widget) {
    }
}

Lalu untuk menggunakannya.

   String text = "my text with action";
    hideText= new SpannableString(text);
    hideText.setSpan(new CustomClickableSpan(){

        @Override
        public void onClick(@NonNull View widget) {
            // your action here !
        }

    }, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    yourtextview.setText(hideText);
    // don't forget this ! or this will not work !
    yourtextview.setMovementMethod(LinkMovementMethod.getInstance());

Semoga ini akan sangat membantu!


1

Dari dokumen pengembang, untuk mengubah warna dan ukuran spannable:

1- membuat kelas:

    class RelativeSizeColorSpan(size: Float,@ColorInt private val color: Int): RelativeSizeSpan(size) {

    override fun updateDrawState(textPaint: TextPaint?) {
        super.updateDrawState(textPaint)
        textPaint?.color = color
    } 
}

2 Buat spannable Anda menggunakan kelas itu:

    val spannable = SpannableStringBuilder(titleNames)
spannable.setSpan(
    RelativeSizeColorSpan(1.5f, Color.CYAN), // Increase size by 50%
    titleNames.length - microbe.name.length, // start
    titleNames.length, // end
    Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
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.