2011-09-08 19 views
18

Sto cercando di cambiare il colore di alcune parole (Risultati della ricerca) in un TextView? Ho provato ad utilizzare i colori ANSI come questo:Come colorare parte di TextView in Android?

text.setText("\u001B31;1m" + "someText"); 

ma non ha funzionato. Come ottengo questo?

+0

Vedere questo: http://stackoverflow.com/questions/4897349/android-coloring-part-of-a-string-using-textview-settext –

risposta

31

questo aiuterà u

Spannable WordtoSpan = new SpannableString("I know just how to whisper");   
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 5, 13, 
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
textview.setText(WordtoSpan); 
+0

5, 13 sono la personaggio, s lunghezza. –

+4

vuoi dire iniziare e finire gli indici? – Marek

+0

Sì. per quale parte vuoi colorare il testo punto iniziale e punto finale della vista testo colorata. –

4

state cercando TextAppearanceSpan e 'SpannableString' Per essere più chiari del flusso di lavoro è la seguente

  1. Crea SpannableString dalla stringa di origine
  2. Creare TextAppearanceSpan e impostarlo tramite chiamata al metodo setSpan su SpannableString metodo textView.setText
  3. chiamata con SpannableString come argomento
2

È possibile anche usare l'HTML, come nel seguente esempio:

string = "<font color='#FFFFFF'>This is my text </font>" + "<font color='#000000'> Another text </font>"; 
textView.setText(Html.fromHtml(string)); 

Senza usare variabile aggiuntiva (soluzione one-line):

textView.setText(Html.fromHtml("<font color='#FFFFFF'>This is my text </font>" + "<font color='#000000'> Another text </font>")); 

E 'abbastanza facile e la soluzione comprensibile :)

+0

Html.fromHtml (stringa) è deprecato ora. Si prega di aggiornare la risposta. –

0

So che sono un po 'in ritardo per la festa, ma penso che questo aiuterà i futuri visitatori.

Si potrebbe voler impostare colori di testo parziale sull'XML del layout anziché utilizzare il codice Java, quindi in base alle risposte precedenti su questo thread ho creato una piccola classe che fa il trucco.

1 - Prima creiamo il nostro componente

package yourpackagehere.component; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Color; 
import android.text.Spannable; 
import android.text.SpannableString; 
import android.text.style.ForegroundColorSpan; 
import android.util.AttributeSet; 

import yourpackagehere.R; 

public class FontSpannableTextView extends TextView { 

    public FontSpannableTextView(Context context) { 
     super(context); 
    } 

    public FontSpannableTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setColorPartialString(context, attrs); 
    } 

    public FontSpannableTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setColorPartialString(context, attrs); 
    } 

    private void setColorPartialString(Context context, AttributeSet attrs) { 
     if (isInEditMode()) { 
      return; 
     } 
     String partialText = null; 
     int partialTextColor = Integer.MIN_VALUE; 

     if (attrs != null) { 
      TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FontSpannableTextView); 
      for (int i = 0; i < a.getIndexCount(); i++) { 
       int attr = a.getIndex(i); 
       switch (attr) { 
        case R.styleable.FontSpannableTextView_fontspannabletextview_partialText: 
         partialText = a.getString(attr); 
         break; 
        case R.styleable.FontSpannableTextView_fontspannabletextview_partialTextColor: 
         partialTextColor = a.getColor(attr, Color.BLACK); 
         break; 
       } 
      } 
      a.recycle(); 
     } 

     if (partialText != null && partialTextColor != Integer.MIN_VALUE) { 
      String wholeText = getText().toString(); 
      Spannable spannable = new SpannableString(wholeText); 
      spannable.setSpan(new ForegroundColorSpan(partialTextColor), 
        wholeText.indexOf(partialText), 
        wholeText.indexOf(partialText) + partialText.length(), 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      setText(spannable); 
     } else { 
      Log.e("YOURTAGHERE","You must provide both partialText and partialTextColor values"); 
     } 
    } 
} 

2 - su attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="FontSpannableTextView"> 
     <attr name="fontspannabletextview_partialText" format="string" /> 
     <attr name="fontspannabletextview_partialTextColor" format="color" /> 
    </declare-styleable> 
</resources> 

3 - Usiamo in nostro layout di prova

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 


    <yourpackagehere.component.FontSpannableTextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" <!-- Hello world! --> 
     android:layout_margin="25dp" 
     app:fontspannabletextview_partialText="@string/world" <!-- world! --> 
     app:fontspannabletextview_partialTextColor="@color/tutorial_yellow" 
     android:textSize="40sp" 
     /> 

</LinearLayout> 

Esempio:

enter image description here