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 )

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

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

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


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

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

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

5

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

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

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


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


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:


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)

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

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


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!


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
)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.