web-dev-qa-db-ja.com

Javaで文字列のテキストの色を複数の色に変更することはできますか?

つまり、単一の文字列で「このテキストは青です」というテキストを青色に変更することはできますか?方法があるはずです...

<TextView
    Android:gravity="left"
    Android:padding="3dip"
    Android:text="This text is white. This text is blue."
    Android:textColor="#ffffff"
    Android:textSize="22dp"/>
33
jmendegan

はい、可能です。このためには、 SpannableString および ForegroundColorSpan を使用する必要があります。

これは次のようになります。

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

112
inazaruk

それを行う簡単な方法は、HTMLを使用し、プログラムでテキストをTextViewに設定することです。

String text = "This text is white. <font color=\"blue\">This text is blue.</font>";
textView.setText(Html.fromHtml(text), BufferType.SPANNABLE);
11
Jason Robinson

これを試して..

TextView update= (TextView) dialog.findViewById(R.id.address);
String colorText= "Driver is nearby "
                + "<font color=\"#E72A02\"><bold>"
                + "43, KR Rd, Tata Silk Farm, Jayanagar"
                + "</bold></font>"
                + " and he is "
                + "<font color=\"#B92000\"><bold>"
                + "11 km"
                + "</bold></font>"
                + " & "
                + "<font color=\"#B92000\"><bold>"
                + "20 mins"
                + "</bold></font>"
                + " away from your current location.";

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

resultは次のようになります。

result

Html.fromHtml(String)は、Android N

Androidの最新バージョンをサポートするには、次のようにします

 val colorText = ("Some Normal Text\n" 
                    + "<font color=\"#FFA500\"><bold> Orange Text </bold></font>"
                    + "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));
        }
2
Hitesh Sahu

これを試すことができます:フラグメント内:

@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"
                + " <font color='"
                + getResources().getColor(R.color.green_color) + "'>" + email
                + "</font>"
                + "Bye";
        shipment_email.setText(Html.fromHtml(text_shipment_email),
                TextView.BufferType.SPANNABLE);
}
1
Maddy

このようなクラスを作成しました:

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

これにより、次のようなことができます。

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

ティッカーテープを作成します。かなりうまく機能し、コードをきれいに保ちます。

1
knaak
String text = "<font color=#000>this color is black </font><font color=#6ab04c>this color is green</font>";

textview.setText(Html.fromHtml(text));
0
nithin joseph

サービス「オンワード」の場合、スターの変更に使用します

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

あなたはこのように見ることができます

enter image description here

0
Dhaval Shingala