Legen Sie die Farbe der TextView-Spanne in Android fest

206

Ist es möglich, die Farbe nur der Textspanne in einer Textansicht festzulegen?

Ich möchte etwas Ähnliches wie die Twitter-App machen, bei der ein Teil des Textes blau ist. Siehe Bild unten:

Alt-Text
(Quelle: twimg.com )

hpique
quelle

Antworten:

429

Eine andere Antwort wäre sehr ähnlich, müsste aber den Text der TextViewzweimal nicht festlegen

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
quelle
Aber wie kann ich die Farbe für mehrere Wörter ändern, wenn alle Texte nicht eine Spanne enthalten?
Mostafa Hashim
1
@mostafahashim erstellt mehrere Bereiche, indem Zeile 3 wiederholt wird wordtoSpan.setSpan (neuer ForegroundColorSpan (Color.RED), 50, 80, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Ashraf Alshahawy
Die Kotlin + Spannable String-Lösung würde so aussehen: stackoverflow.com/questions/4032676/…
Dmitrii Leonov
81

Hier ist eine kleine Hilfefunktion. Ideal für mehrere Sprachen!

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
quelle
37

Ich finde visuelle Beispiele immer hilfreich, wenn ich versuche, ein neues Konzept zu verstehen.

Hintergrundfarbe

Geben Sie hier die Bildbeschreibung ein

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

Vordergrundfarbe

Geben Sie hier die Bildbeschreibung ein

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

Kombination

Geben Sie hier die Bildbeschreibung ein

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

Weitere Studie

Suragch
quelle
29

Wenn Sie mehr Kontrolle wünschen, können Sie die TextPaintKlasse überprüfen . So verwenden Sie es:

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
quelle
getColor (int id) ist auf Android 6.0 Marshmallow (API 23) veraltet stackoverflow.com/questions/31590714/…
Eka putra
Schöne Antwort mit Click Listener.
Muhaiminur Rahman
20

TextViewStellen Sie den Text Ihres Textes ein und definieren Sie einen ForegroundColorSpanfür Ihren Text.

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
quelle
Vielen Dank! Ist dies möglich, ohne den Text zuerst der Textansicht zuzuweisen?
Hpique
Ich habe mich nicht gut erklärt. Lassen Sie mich umformulieren. Sind die ersten 3 Zeilen notwendig? Können Sie das Spannable-Objekt nicht direkt aus der Zeichenfolge erstellen?
Hpique
Nein, Sie müssen den Text Ihrer TextView in einem Buffer Spannable speichern, um die Vordergrundfarbe zu ändern.
Jorgesys
Ich möchte dasselbe mit der Farbe tun und ich möchte, dass alles fett ist, außer dem farbigen Teil, dem Teil, den ich kursiv sein möchte. Wie kann ich das tun?
Lukap
1
Wie setze ich einen Klick in die Spanne?
Rishabh Srivastava
13

Eine andere Möglichkeit, die in einigen Situationen verwendet werden kann, besteht darin, die Verknüpfungsfarbe in den Eigenschaften der Ansicht festzulegen, die das Spannable verwendet.

Wenn Ihr Spannable beispielsweise in einer Textansicht verwendet werden soll, können Sie die Verknüpfungsfarbe in XML wie folgt festlegen:

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

Sie können es auch im Code einstellen mit:

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

Es gibt eine Fabrik zum Erstellen des Spannable und zum Vermeiden der Besetzung wie folgt:

Spannable span = Spannable.Factory.getInstance().newSpannable("text");
Thomas Emil Hansen
quelle
1
Können Sie erläutern, wie SpannableFactory verwendet wird? Wie soll "Text" aussehen?
Piotr
Wie wird es nach dem Erstellen des Spannable durch die SpannableFactory verwendet?
MBH
5

Stellen Sie die Farbe auf Text ein, indem Sie String und Farbe übergeben :

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

Stellen Sie Text in TextView / Button / EditText usw. ein, indem Sie den folgenden Code aufrufen:

Textübersicht:

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

Farbige Zeichenfolge abrufen:

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

Text in TextView festlegen:

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

Getan

Hiren Patel
quelle
4
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;
}

Ausgabe:

Geben Sie hier die Bildbeschreibung ein

Ahamadullah Saikat
quelle
Sie mögen Hasina nicht
Abu
3

Nur um die akzeptierte Antwort zu ergänzen, da alle Antworten nur zu sprechen scheinen android.graphics.Color: Was ist, wenn die gewünschte Farbe definiert ist res/values/colors.xml?

Betrachten Sie beispielsweise Material Design-Farben, die definiert sind in colors.xml:

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

( android_material_design_colours.xmlist dein bester Freund)

Verwenden ContextCompat.getColor(getContext(), R.color.md_blue_500)Sie dann, wo Sie verwenden würden Color.BLUE, so dass:

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

wird:

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

Wo ich das gefunden habe:

Antonio Vinicius Menezes Medei
quelle
2

Hier ist eine Kotlin-Erweiterungsfunktion, die ich dafür habe

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

Verwenden Sie es, nachdem Sie Ihren Text wie folgt auf die Textansicht eingestellt haben

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

textViewTip.setColouredSpan("Warning", blueberry)
Ivan Wooll
quelle
0
  1. Erstellen Sie eine Textansicht in Ihrem Layout
  2. Fügen Sie diesen Code in Ihre MainActivity ein

    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
quelle
0

Unten funktioniert perfekt für mich

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

Ausgabe für obigen Code

Geben Sie hier die Bildbeschreibung ein

OmiK
quelle
0

Einige Antworten hier sind nicht aktuell. Weil Sie (in den meisten Fällen) Ihrem Link eine benutzerdefinierte Clic-Aktion hinzufügen .

Außerdem wird, wie in der Hilfe zur Dokumentation angegeben, die Farbe Ihrer übergreifenden Zeichenfolgenverknüpfung standardmäßig verwendet. "Die Standard-Linkfarbe ist die Akzentfarbe des Themas oder Android: textColorLink, wenn dieses Attribut im Thema definiert ist."

Hier ist der Weg, um es sicher zu machen.

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

Dann, um es zu benutzen.

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

Hoffe das wird stark helfen!

Zhar
quelle
0

So ändern Sie in den Entwicklerdokumenten die Farbe und Größe eines Spanners:

1- Erstellen Sie eine Klasse:

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

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

2 Erstellen Sie Ihre Spannbarkeit mit dieser Klasse:

    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
quelle