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 )

hpique
sumber

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);
DanO
sumber
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);
}
mach
sumber
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

Suragch
sumber
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);
    }
};
Tiago
sumber
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);
Jorgesys
sumber
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);
Dave
sumber
6

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

Spannable span = Spannable.Factory.getInstance().newSpannable("text");
Thomas Emil Hansen
sumber
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

Hiren Patel
sumber
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

Ahamadullah Saikat
sumber
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:

Antonio Vinicius Menezes Medei
sumber
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)
Ivan Wooll
sumber
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
Sunil
sumber
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

OKI
sumber
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!

Zhar
sumber
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
)
Badr
sumber