여러 개의 컬러 텍스트가있는 단일 TextView


167

제목에서 알 수 있듯이 단일 textview 요소에서 두 가지 다른 색상의 문자를 얻을 수 있다는 것을 알고 싶습니다.



1
asker가 색상을 구체적으로 요구하기 때문에 복제되지 않습니다.
Iqbal


: 나는 몇 가지 라이브러리가 너무하는 이와 유사한 동작을 가진 썼다 github.com/ha-yi/MultiColorTextView
Hayi Nukman

답변:


328

당신이를 포맷하는 경우 예, String함께 htmlfont-color특성 다음 방법에 전달Html.fromHtml(your text here)

String text = "<font color=#cc0029>First Color</font> <font color=#ffcc00>Second Color</font>";
yourtextview.setText(Html.fromHtml(text));

감사합니다. +1
Hardik Joshi

10
를 사용하여 userinput을 피하는 것을 잊지 마십시오 Html.escapeHtml(str).
kelunik 2016 년

1
API 레벨 1에 추가
2red13

3
경고 일뿐입니다. 텍스트를 대문자로 사용해야 할 때 문제가 발생했습니다. XML에서 android : textAllCaps = "true"를 사용하고 있었고 동시에 HTML 내용이 대문자였습니다. 작동하지 않았습니다. XML 속성을 제거했는데 이제 제대로 작동합니다. 코드에서 setAllCaps ()를 사용하면 동일한 문제가 발생하므로주의하십시오.
joao2fast4u

5
Html.fromHtml(String)더 이상 사용되지 않습니다. 대신을 사용하십시오 Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY). 자세한 내용은 여기를 참조하십시오.
JediBurrell '28

165

다음과 같이 HTML없이 여러 색상으로 선을 인쇄 할 수 있습니다.

TextView textView = (TextView) findViewById(R.id.mytextview01);
Spannable word = new SpannableString("Your message");        

word.setSpan(new ForegroundColorSpan(Color.BLUE), 0, word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

textView.setText(word);
Spannable wordTwo = new SpannableString("Your new message");        

wordTwo.setSpan(new ForegroundColorSpan(Color.RED), 0, wordTwo.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(wordTwo);

감사합니다. 또한 BackgroundColorSpan을 수행 할 수 있습니다. 예를 들어 WordToSpan과 WordtoSpan에 작은 오타가 있습니다. To
steveh

어떻게 텍스트 뷰를 테스트 장치에 대한 한 가지 보장하기 위해 않습니다 Color.RED의 텍스트 끝 stackoverflow.com/questions/26611533/...
sudocoder

1
java.lang.StringIndexOutOfBoundsException이 발생하는 동안 작동하지 않습니다. length = 3; index = 12`
무하마드 바바

1
StringIndexOutOfBoundsException 자체는 설명이 필요합니다. 길이 이상으로 문자열에 액세스하고 있습니다.
Swapnil Kotwal

1
내 문자열이 수정되지 않았으므로 앱 실행시 문자열이 생성됩니다. 나는이 질문에 대한 거의 모든 대답을 시도했습니다. 그러나이 솔루션 만 나를 위해 일했습니다.
Md. Sabbir Ahmed

33

Spannable효과를 적용 하는 데 사용할 수 있습니다 TextView.

다음은 TextView텍스트 의 첫 부분만을 색칠하는 예제입니다 (HTML 예제와 같이 문자열을 하드 코딩하는 대신 색상을 동적으로 설정할 수 있습니다!)

    mTextView.setText("Red text is here", BufferType.SPANNABLE);
    Spannable span = (Spannable) mTextView.getText();
    span.setSpan(new ForegroundColorSpan(0xFFFF0000), 0, "Red".length(),
             Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

이 예에서는 0xFFFF0000을 getResources().getColor(R.color.red)


1
이 대문자가 필요한 경우 단순히 문자열을 toUpperCase ()하십시오.
Graeme

33

나는 이렇게했다 :

참조 확인

문자열색상전달 하여 텍스트 색상설정하십시오 .

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");
String surName = getColoredSpanned("Patel","#000080");

색상이 다른 두 문자열의 TextView에서 텍스트를 설정하십시오.

txtView.setText(Html.fromHtml(name+" "+surName));

끝난


1
nyc one이지만 HTml.fromHtml은 API 24에서 사용되지 않습니다
Anuraj R

당신에게 전화를 대체 할 수있는 Html.fromHtml("...")호출로Html.fromHtml("...", FROM_HTML_MODE_LEGACY)
stkent

31

SpannableStringBuilder 사용

SpannableStringBuilder builder = new SpannableStringBuilder();

SpannableString str1= new SpannableString("Text1");
str1.setSpan(new ForegroundColorSpan(Color.RED), 0, str1.length(), 0);
builder.append(str1);

SpannableString str2= new SpannableString(appMode.toString());
str2.setSpan(new ForegroundColorSpan(Color.GREEN), 0, str2.length(), 0);
builder.append(str2);

TextView tv = (TextView) view.findViewById(android.R.id.text1);
tv.setText( builder, TextView.BufferType.SPANNABLE);

8

이봐, 난 이걸 해봤 어

TextView textView=(TextView)findViewById(R.id.yourTextView);//init

//here I am appending two string into my textView with two diff colors.
//I have done from fragment so I used here getActivity(), 
//If you are trying it from Activity then pass className.this or this; 

textView.append(TextViewUtils.getColoredString(getString(R.string.preString),ContextCompat.getColor(getActivity(),R.color.firstColor)));
textView.append(TextViewUtils.getColoredString(getString(R.string.postString),ContextCompat.getColor(getActivity(),R.color.secondColor)));

TextViewUtils 클래스 안에이 메소드를 추가하십시오.

 /***
 *
 * @param mString this will setup to your textView
 * @param colorId  text will fill with this color.
 * @return string with color, it will append to textView.
 */
public static Spannable getColoredString(String mString, int colorId) {
    Spannable spannable = new SpannableString(mString);
    spannable.setSpan(new ForegroundColorSpan(colorId), 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    Log.d(TAG,spannable.toString());
    return spannable;
}

방금 업데이트 한 번 확인하면 효과가 있습니다.
압둘 리즈 완 September

이 문자열을 사용하기 위해 Html.fromHtml을 사용합니까?
Sergey Shustikov

string.xml 파일 내부에서 변수를 만들고 이것을 설정했습니다. 지금 막 작동하고 있습니다. 문자열을 여기에 줄 수 있습니까?
압둘 리즈 완 September

5

다음과 같이 문자열 파일에서 문자열을 사용하는 것이 좋습니다.

    <string name="some_text">
<![CDATA[
normal color <font color=\'#06a7eb\'>special color</font>]]>
    </string>

용법:

textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)

4

나는이 질문과 비슷한 다른 질문에 대한 코드를 작성했지만 그 질문이 중복되어 대답 할 수 없으므로 누군가가 동일한 요구 사항을 찾고 있다면 여기에 내 코드를 넣는 것입니다.

코드가 완전히 작동하지 않기 때문에 약간의 변경을 거쳐 작동해야합니다.

코드는 다음과 같습니다.

확장 가능한 텍스트를 사용하는 @Graeme 아이디어를 사용했습니다.

String colorfulText = "colorfulText";       
    Spannable span = new SpannableString(colorfulText);             

    for ( int i = 0, len = colorfulText.length(); i < len; i++ ){
        span.setSpan(new ForegroundColorSpan(getRandomColor()), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);                     
    }   

    ((TextView)findViewById(R.id.txtSplashscreenCopywrite)).setText(span);

임의의 색상 방법 :

  private int getRandomColor(){
        Random rnd = new Random();
        return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
    }

2

이 시도:

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
      "<small>" + description + "</small>" + "<br />" + 
      "<small>" + DateAdded + "</small>"));

2

HTML 형식 구문 분석보다 빠르기 때문에 가능한 경우 HTML 형식 대신 SpannableBuilder 클래스를 사용하십시오. Github의 내 벤치 마크 "SpannableBuilder vs HTML"을 참조하십시오. Thanks!


1

멋진 답변! Spannable을 사용하여 무지개 색의 텍스트를 만들 수있었습니다. (이것은 모든 색상 배열에서 반복 될 수 있습니다). 누군가에게 도움이된다면 내 방법은 다음과 같습니다.

private Spannable buildRainbowText(String pack_name) {
        int[] colors = new int[]{Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE};
        Spannable word = new SpannableString(pack_name);
        for(int i = 0; i < word.length(); i++) {
            word.setSpan(new ForegroundColorSpan(colors[i]), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return word;
    }

그런 다음 방금 setText (buildRainboxText (pack_name)); 내가 전달하는 모든 단어는 15 자 미만이며 이것은 5 색을 3 번 반복합니다-사용의 배열 / 색 길이를 조정하고 싶습니다!


1
if (Build.VERSION.SDK_INT >= 24) {
     Html.fromHtml(String, flag) // for 24 API  and more
 } else {
     Html.fromHtml(String) // or for older API 
 }

24 API 이상 (플래그)

public static final int FROM_HTML_MODE_COMPACT = 63;
public static final int FROM_HTML_MODE_LEGACY = 0;
public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1;
public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0;
public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1;

더 많은 정보


1

API 24부터 FROM_HTML_OPTION_USE_CSS_COLORS가 있으므로 font color=" 훨씬 더 명확하게 반복하지 않고 CSS에서 색상을 정의 할 수 있습니다 .HTML이 있고 미리 정의 된 태그를 강조 표시하려는 경우 HTML 상단에 CSS 조각을 추가하면됩니다.


0

2020 년 6 월 25 일 @canerkaseler

Kotlin Answer 를 공유하고 싶습니다 :

fun setTextColor(tv:TextView, startPosition:Int, endPosition:Int, color:Int){
    val spannableStr = SpannableString(tv.text)

    val underlineSpan = UnderlineSpan()
    spannableStr.setSpan(
        underlineSpan,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    val backgroundColorSpan = ForegroundColorSpan(this.resources.getColor(R.color.agreement_color))
    spannableStr.setSpan(
        backgroundColorSpan,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    val styleSpanItalic = StyleSpan(Typeface.BOLD)
    spannableStr.setSpan(
        styleSpanItalic,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    tv.text = spannableStr
}

그런 다음 위 함수를 호출하십시오. 하나 이상을 호출 할 수 있습니다.

setTextColor(textView, 0, 61, R.color.agreement_color)
setTextColor(textView, 65, 75, R.color.colorPrimary)

출력 : 서로 밑줄과 다른 색상을 볼 수 있습니다.

아리따움

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.