Imposta il colore dell'intervallo di TextView in Android


206

È possibile impostare il colore dell'intervallo di testo in un TextView?

Vorrei fare qualcosa di simile all'app Twitter, in cui una parte del testo è blu. Vedi l'immagine sotto:

testo alternativo
(fonte: twimg.com )

Risposte:


430

Un'altra risposta sarebbe molto simile, ma non avrebbe bisogno di impostare il testo del TextViewdoppio

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

ma come posso cambiare il colore per più parole in tutto il testo e non in un solo intervallo?
mostafa hashim,

1
@mostafahashim crea più span ripetendo la riga 3 wordtoSpan.setSpan (nuovo ForegroundColorSpan (Color.RED), 50, 80, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Ashraf Alshahawy,

La soluzione Kotlin + Spannable String sarebbe simile a questo stackoverflow.com/questions/4032676/…
Dmitrii Leonov

82

Ecco una piccola funzione di aiuto. Ottimo per quando hai più lingue!

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

Trovo sempre utili esempi visivi quando provo a capire un nuovo concetto.

Colore di sfondo

inserisci qui la descrizione dell'immagine

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

Colore di primo piano

inserisci qui la descrizione dell'immagine

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

Combinazione

inserisci qui la descrizione dell'immagine

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

Ulteriore studio


30

Se vuoi un maggiore controllo, potresti voler controllare la TextPaintclasse. Ecco come usarlo:

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) è obsoleto su Android 6.0 Marshmallow (API 23) stackoverflow.com/questions/31590714/…
Eka putra

Bella risposta con Click Listener.
Muhaiminur Rahman,

20

Imposta il TextViewtesto del tuo spannable e definisci un ForegroundColorSpanper il tuo testo.

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

Grazie! È possibile farlo senza prima assegnare il testo a TextView?
hpique

Non mi sono spiegato bene. Lasciami riformulare. Sono necessarie le prime 3 righe? Non è possibile creare direttamente l'oggetto Spannable dalla stringa?
hpique

No, devi archiviare il testo di TextView in un Buffer Spannable per cambiare il colore di primo piano.
Jorgesys,

Voglio fare la stessa cosa con il colore e voglio che tutto sia audace tranne la parte colorata, quella parte che voglio essere in corsivo, come posso farlo?
Lukap,

1
come impostare il clic nell'intervallo?
Rishabh Srivastava,

14

Un altro modo che potrebbe essere utilizzato in alcune situazioni è quello di impostare il colore del collegamento nelle proprietà della vista che utilizza lo Spannable.

Se Spannable verrà utilizzato in un TextView, ad esempio, puoi impostare il colore del collegamento nell'XML in questo modo:

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

Puoi anche impostarlo nel codice con:

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

6

C'è una fabbrica per creare Spannable ed evitare il cast, in questo modo:

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

1
Potresti chiarire come usare SpannableFactory? Come dovrebbe apparire il "testo"?
Piotr,

dopo aver creato Spannable da SpannableFactory, quindi come usarlo?
MBH,

6

Imposta colore sul testo per passare String e colore :

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

Imposta il testo su TextView / Button / EditText ecc chiamando il codice seguente:

TextView:

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

Ottieni una stringa colorata:

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

Imposta testo su TextView:

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

Fatto


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

Produzione:

inserisci qui la descrizione dell'immagine


non ti piace Hasina 🤣
Abu Nayem

4

Solo per aggiungere alla risposta accettata, poiché tutte le risposte sembrano parlare android.graphics.Colorsolo: cosa succede se il colore che desidero è definito in res/values/colors.xml?

Ad esempio, considera i colori di Material Design definiti in colors.xml:

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

( android_material_design_colours.xmlè il tuo migliore amico)

Quindi usa ContextCompat.getColor(getContext(), R.color.md_blue_500)dove vorresti usare Color.BLUE, in modo che:

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

diventa:

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

Dove ho trovato che:


3

Ecco una funzione di estensione Kotlin che ho per questo

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

Usalo dopo aver impostato il testo su TextView in questo modo

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

textViewTip.setColouredSpan("Warning", blueberry)

1
  1. crea una visualizzazione di testo nel tuo layout
  2. incolla questo codice nel tuo MainActivity

    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 seguito funziona perfettamente per me

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

Uscita per il codice sopra

inserisci qui la descrizione dell'immagine


1

Alcune risposte qui non sono aggiornate. Perché, nella maggior parte dei casi, aggiungerai un'azione clic personalizzata sul tuo link .

Inoltre, come fornito dalla guida della documentazione, il colore del collegamento della stringa con spanning sarà predefinito. "Il colore di collegamento predefinito è il colore di accento del tema o android: textColorLink se questo attributo è definito nel tema".

Ecco il modo di farlo in sicurezza.

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

Quindi usarlo.

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

Spero che questo sia di grande aiuto!


1

Dai documenti dello sviluppatore, per modificare il colore e le dimensioni di uno spannable:

1- creare una classe:

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

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

2 Crea il tuo spannable usando quella classe:

    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
)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.