Is het mogelijk om de tekstkleur in een tekenreeks in meerdere kleuren in Java te wijzigen?

Wat ik bedoel is, is het mogelijk om de tekst "Deze tekst is blauw" te veranderen in de kleur blauw in een enkele string? Er moet een manier zijn ...


30

7 antwoord

Ja het is mogelijk. Hiervoor moet u SpannableString en ForegroundColorSpan .

Dit zou er ongeveer zo uit moeten zien:

SpannableStringBuilder builder = new SpannableStringBuilder();

String red = "this is red";
SpannableString redSpannable= new SpannableString(red);
redSpannable.setSpan(new ForegroundColorSpan(Color.RED), 0, red.length(), 0);
builder.append(redSpannable);

String white = "this is white";
SpannableString whiteSpannable= new SpannableString(white);
whiteSpannable.setSpan(new ForegroundColorSpan(Color.WHITE), 0, white.length(), 0);
builder.append(whiteSpannable);

String blue = "this is blue";
SpannableString blueSpannable = new SpannableString(blue);
blueSpannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, blue.length(), 0);
builder.append(blueSpannable);

mTextView.setText(builder, BufferType.SPANNABLE);

enter image description here

100
toegevoegd
U bent vergeten het buffertype in uw laatste regel in te stellen
toegevoegd de auteur Jason Robinson, de bron
@inazaruk Goed om te weten dat TextView automatisch het doorgegeven type bepaalt als u niet opgeeft. Ik heb het altijd aangegeven, dus ik heb het nooit geweten. Bedankt.
toegevoegd de auteur Jason Robinson, de bron
Werkt niet voor mij op android 7.0 in AlertDialog 's setMessage()
toegevoegd de auteur Nitesh Verma, de bron
Hoe zou je dit tegelijkertijd doen voor een kleur EN een stijl (cursief of vet)?
toegevoegd de auteur Scott Biggs, de bron
Het kan in een aparte klas gaan als je dat wilt. Maar het kan ook in MainActivity zitten. Er is geen beperking, maar u moet toegang hebben tot TextView waarvoor u SpannableString wilt instellen.
toegevoegd de auteur inazaruk, de bron
@ jrobinson3k1, het werkt in mijn geval zonder buffertype. Maar ik denk nog steeds dat het beter is om Buffertype op te geven. Bedankt voor de correctie.
toegevoegd de auteur inazaruk, de bron
waarom werkt dit niet voor mij ?????????
toegevoegd de auteur faeze saghafi, de bron
Gewoon nieuwsgierig ... Zou dit in een aparte klas moeten gaan? Ik werk met Android, dus moet het in de klasse MainActivity zijn?
toegevoegd de auteur jmendegan, de bron

Een eenvoudige manier om dit te doen, is door HTML te gebruiken en de tekst programmatisch in de TextView in te stellen.

String text = "This text is white. This text is blue.";
textView.setText(Html.fromHtml(text), BufferType.SPANNABLE);
10
toegevoegd
toegevoegd de auteur Jason Robinson, de bron
Wat als u verwijst naar een tekenreeks in string.xml?
toegevoegd de auteur portfoliobuilder, de bron

Probeer dit..

TextView update= (TextView) dialog.findViewById(R.id.address);
String colorText= "Driver is nearby "
                + ""
                + "43, KR Rd, Tata Silk Farm, Jayanagar"
                + ""
                + " and he is "
                + ""
                + "11 km"
                + ""
                + " & "
                + ""
                + "20 mins"
                + ""
                + " away from your current location.";

        update.setText(Html.fromHtml(colorText));

en het resultaat zal zo zijn ..

result

4
toegevoegd

Je kunt dit proberen: In een fragment:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

View rootView = inflater.inflate(
                R.layout.shipment_accepted_fragment,
                container, false);

        String email = "([email protected])";

        TextView shipment_email = (TextView) rootView
                .findViewById(R.id.textview);
        String text_shipment_email = "Hello"
                + " " + email
                + ""
                + "Bye";
        shipment_email.setText(Html.fromHtml(text_shipment_email),
                TextView.BufferType.SPANNABLE);
}
1
toegevoegd

Ik heb een klas als deze gemaakt:

import android.text.SpannableStringBuilder;
import android.text.style.CharacterStyle;

public class StyleableSpannableStringBuilder extends SpannableStringBuilder {
    public StyleableSpannableStringBuilder appendWithStyle(CharacterStyle c, CharSequence text) {
        super.append(text);
        int startPos = length() - text.length();
        setSpan(c, startPos, length(), 0);
        return this;
    }

    public StyleableSpannableStringBuilder appendWithStyle(CharacterStyle [] c, CharSequence text) {
        super.append(text);
        int startPos = length() - text.length();
        for (CharacterStyle c1 : c)
            setSpan(c1, startPos, length(), 0);         
        return this;
    }       
}

Dit stelt me ​​in staat om dit soort dingen te doen:

private void buildTickerItem(DelayedQuoteServiceObject o)
{   
    Double lastPrice = Double.parseDouble(o.getValue("LastPrice"));
    Double dayChange = Double.parseDouble(o.getValue("DayChange"));
    Double percentChange = Double.parseDouble(o.getValue("PercentDayChange"))/100;

    if (o.isIndex() == true)
    {

        tickerTapeData.appendWithStyle(new StyleSpan(Typeface.BOLD),o.getDisplayName());            
        tickerTapeData.append(" "+ indexFormat.format(lastPrice) + " (");

        if (dayChange >= 0)
            tickerTapeData.appendWithStyle(new ForegroundColorSpan(Colours.getTickerPositive()), indexFormat.format(dayChange));        
        else
            tickerTapeData.appendWithStyle(new ForegroundColorSpan(Color.RED), indexFormat.format(dayChange));
    }
    else
    {
        tickerTapeData.appendWithStyle(new StyleSpan(Typeface.BOLD), o.ticker);

        tickerTapeData.append("@"+ dollarFormat.format(lastPrice) + " (");              

        if (dayChange >= 0)
            tickerTapeData.appendWithStyle(new ForegroundColorSpan(Colours.getTickerPositive()), dollarFormat.format(dayChange));       
        else
            tickerTapeData.appendWithStyle(new ForegroundColorSpan(Color.RED), dollarFormat.format(dayChange));


    }

    tickerTapeData.append("/");


    if (dayChange >= 0)
        tickerTapeData.appendWithStyle(new ForegroundColorSpan(Colours.getTickerPositive()), percentFormat.format(percentChange));      
    else
        tickerTapeData.appendWithStyle(new ForegroundColorSpan(Color.RED), percentFormat.format(percentChange));

    tickerTapeData.append(")  ");       
}

Om een ​​tickertape te maken. Werkt best goed en houdt de code schoon.

1
toegevoegd
Scott, het accepteert een array van CharacterStyles, zodat je de appendWithStyle (nieuwe CharacterStyle [] {nieuwe ForegroundColorSpan (BLUE), nieuwe StyleSpan (ITALICS)}, "Blue italicized text" kunt aanroepen;
toegevoegd de auteur knaak, de bron
Ik moet opnieuw vragen, hoe voeg je meerdere stijlen tegelijkertijd toe? Stel dat u bijvoorbeeld een paar woorden blauw, cursief en sommige wilt weergeven?
toegevoegd de auteur Scott Biggs, de bron
Leuk! Ik denk dat ik dit ook zal proberen ...
toegevoegd de auteur jmendegan, de bron

Html.fromHtml(String) is deprecated in Android N

Om de nieuwste versie van Android zoiets als dit te ondersteunen

 val colorText = ("Some Normal Text\n" 
                    + " Orange Text "
                    + "More Normal text")

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            venueAddressValue.setText(Html.fromHtml(colorText, Html.FROM_HTML_MODE_LEGACY));
        } else {
            venueAddressValue.setText(Html.fromHtml(colorText));
        }
1
toegevoegd

I am use for a change star if service "Onward"

String c = "*" + getResources().getString(R.string.rupee) + str_pay_at_store;
SpannableString spannable2 = new SpannableString(c);
spannable2.setSpan(new ForegroundColorSpan(Color.RED), 0, 1, 
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_payatstore.setText(spannable2);

Je kunt het zo zien

enter image description here

0
toegevoegd