AndroidでTextViewスパンの色を設定する


206

TextViewでテキストのスパンのみの色を設定することは可能ですか?

テキストの一部が青色で表示される、Twitterアプリと同様のことを実行したいと思います。下の画像を参照してください。

代替テキスト
(ソース:twimg.com

回答:


430

別の答えも非常に似ていますが、TextView2回のテキストを設定する必要はありません。

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

しかし、複数の単語の色を1つのスパンではなくすべてのテキストで変更するにはどうすればよいですか?
mostafa hashim 2015年

1
@mostafahashimは、3行目を繰り返すことで複数のスパンを作成しますwordtoSpan.setSpan(new ForegroundColorSpan(Color.RED)、50、80、Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Ashraf Alshahawy 2016年

Kotlin + Spannable文字列の解決策は、次のようになりますstackoverflow.com/questions/4032676/...
Dmitriiレオーノフ

82

ここに小さなヘルプ機能があります。複数の言語がある場合に最適です!

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

38

新しい概念を理解しようとするときは、常に視覚的な例が役立つと思います。

背景色

ここに画像の説明を入力してください

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

前景色

ここに画像の説明を入力してください

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

組み合わせ

ここに画像の説明を入力してください

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

さらなる研究


30

より細かく制御したい場合は、TextPaintクラスを確認することをお勧めします。使用方法は次のとおりです。

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)は、アンドロイド6.0マシュマロ(API 23)に推奨されません stackoverflow.com/questions/31590714/...
エカプトラ

クリックリスナーを使った素晴らしい答え。
Muhaiminur Ra​​hman

20

TextView´テキストを拡張可能に設定し、テキストにを定義ForegroundColorSpanします。

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

ありがとう!最初にTextViewにテキストを割り当てずにこれを行うことはできますか?
hpique 2010

私は自分自身をうまく説明していませんでした。言い換えましょう。最初の3行は必要ですか?文字列から直接Spannableオブジェクトを作成できませんか?
hpique 2010

いいえ、前景色を変更するには、TextViewのテキストをバッファーSpannableに保存する必要があります。
Jorgesys 2010

色で同じことをしたいのですが、色付きの部分、イタリックにしたい部分を除いてすべてを太字にしたいのですが、どうすればいいですか?
Lukap

1
スパンでクリックを設定する方法?
Rishabh Srivastava

14

状況によっては、別の方法として、Spannableを使用しているビューのプロパティでリンクの色を設定することもできます。

たとえばSpannableがTextViewで使用される場合、次のようにXMLでリンクの色を設定できます。

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

コードで次のように設定することもできます:

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

6

Spannableを作成するためのファクトリがあり、次のようにキャストを回避します。

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

1
SpannableFactoryの使い方を明確にしていただけませんか?「テキスト」はどのように見えるべきですか?
Piotr

SpannableFactoryによってSpannableを作成した後、それをどのように使用しますか?
MBH

6

色の設定上のテキストによって文字列の受け渡し色を

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

テキストをオンに設定以下のコードを呼び出して TextView / Button / EditTextなどに。

TextView:

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

色付きの文字列を取得:

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

TextViewにテキストを設定します。

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

できた


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

出力:

ここに画像の説明を入力してください


あなたは、ハシナ🤣好きではない
アブNayem

4

受け入れられた答えに追加するために、すべての答えは話しているandroid.graphics.Colorだけのようです:私が欲しい色がで定義されている場合はどうなりres/values/colors.xmlますか?

たとえば、で定義されているマテリアルデザインの色について考えてみましょうcolors.xml

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

android_material_design_colours.xmlあなたの親友です)

次に、を使用するContextCompat.getColor(getContext(), R.color.md_blue_500)場所を使用してColor.BLUE、次のようにします。

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

になる:

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

私が見つけた場所:


3

これは私がこれのために持っているKotlin拡張機能です

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

テキストをTextViewに設定したら、次のように使用します

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

textViewTip.setColouredSpan("Warning", blueberry)

1
  1. urレイアウトでtextviewを作成する
  2. このコードをur MainActivityに貼り付けます

    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

1

以下は私にとって完璧に機能します

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

上記のコードの出力

ここに画像の説明を入力してください


1

ここでの回答の一部は最新のものではありません。なぜなら、ほとんどの場合、リンクにカスタムclicアクションを追加するからです。

さらに、ドキュメントのヘルプで提供されているように、スパンストリングリンクの色はデフォルトの色になります。 「デフォルトのリンクの色は、テーマのアクセントカラー、またはこの属性がテーマで定義されている場合はandroid:textColorLinkです。」

安全に行う方法は次のとおりです。

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

次に、それを使用します。

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

これが強く役立つことを願っています!


1

開発者ドキュメントから、スパン可能の色とサイズを変更するには:

1-クラスを作成します。

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

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

2そのクラスを使用してスパナブルを作成します。

    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
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.