TextView에서 한 단어의 텍스트 색상 변경


97

나는에서 하나의 단어의 텍스트의 색상을 변경하는 방법을 찾고 있어요 TextView내에서 Activity.

예를 들면 다음과 같습니다.

String first = "This word is ";
String next = "red"
TextView t = (TextView) findViewById(R.id.textbox);
t.setText(first + next);

next텍스트 색상 을 빨간색으로 변경하려면 어떻게해야 합니까?




답변:


173

내가 아는 가장 쉬운 방법은 html을 사용하는 것입니다.

String first = "This word is ";
String next = "<font color='#EE0000'>red</font>";
t.setText(Html.fromHtml(first + next));

그러나 색상을 변경하려면 TextView를 다시 빌드해야하므로 번거로울 수 있습니다.


1
이것은 확실히 가장 간단한 방법이지만 색상이 color = '# EE0000'이면 안됩니다. 파운드 기호는 16 진수 색상을 표시하는 데 필요합니다.
Tom

고마워요! 나는 이것을 실제 코드에서 복사했는지 또는 색상 생성기 웹 사이트의 메모리에서 복사했는지 기억하지 못하므로 이전에는 작동하지 않았을 수 있습니다.
Dan

확인하세요! 또한 8 자리 16 진수 코드를 사용할 수 없으므로 알파 구성 요소가 없다는 것을 알았습니다. 그게 잠시 저를 당혹스럽게했습니다.
Tom

사용하여 fromHtml지금은 사용되지 않습니다
알렉스 졸릭

Html.fromHtml더 이상 사용되지 않습니다. 이 솔루션 은 저에게 효과적이었습니다!
coderpc

74
t.setText(first + next, BufferType.SPANNABLE);
Spannable s = (Spannable)t.getText();
int start = first.length();
int end = start + next.length();
s.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

스패너 블을 사용해야합니다. 이것은 또한 일부 텍스트의 크기를 늘리고, 굵게 만드는 등의 작업을 허용합니다. 심지어 일부 이미지를 넣을 수도 있습니다.


4
감사합니다. 이 경우 "start + next.length ()"대신 "s.length ()"를 사용할 수 있습니다. int end = s.length ();
Oleg

1
Xamarin.Android 솔루션을 찾는 사람의 경우. 컨트롤의 속성을 SpannableString사용하여 개체를 할당 할 수 있습니다 TextFormatted.
Jamshaid Kamran

이 작업을 할 수 없습니다. BK의 솔루션으로 끝났습니다.
2b77bee6-5445-4c77-b1eb-4df3e5

1. 빌드가 있으면 항상 사용하는 것이 좋습니다. 2. 무엇이 당신을 위해 작동하지 않았습니까? 이 솔루션은 오래되고 매우 오래되었습니다. 일부 API가 변경, 추가, 제거, 버그 수정, 정확히 작동하지 못한 것은 무엇입니까?
codeScriber

2
내가 얻을 java.lang.String cannot be cast to android.text.Spannable오류입니다.
lashgar

37

다음과 같이 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);

new ForegroundColorSpan(Color)텍스트를 원래 기본 색상으로 유지하기 위해 바꿀 수있는 것이 있습니까?
cjnash

textview 중간에 일반 텍스트 (문자열)를 추가하는 방법은 무엇입니까?
Ragavendra M

5

긴 문자열의 경우 다음을 사용할 수 있습니다.

String help = getString(R.string.help);
help = help.replace("some word", "<font color='#EE0000'>some word</font>");
txtDesc.setText(Html.fromHtml(help));

2

텍스트 String내부의 특정 인스턴스의 모든 상태를 변경하려면 TextView(대소 문자 구분 안 함) StringBuilders 를 사용할 수 있습니다 SpannableString.

StringBuilder textBuilder = new StringBuilder(myTextView.getText().toString());
StringBuilder searchedTextBuilder = new StringBuilder((mySearchedString));
SpannableString spannableString = new SpannableString(myTextView.getText().toString());

int counter = 0;
int index = 0;

for (int i = 0;i < textBuilder.length() - mySearchedString.length() - 1;i++)
{
    counter = 0;
    if (Character.toLowerCase(textBuilder.charAt(i)) == Character.toLowerCase(searchedTextBuilder.charAt(index)))
    {
        counter++;
        index++;
        for (int j = 1,z = i + 1;j < mySearchedString.length() - 1;j++,z++)
        {
            if (Character.toLowerCase(textBuilder .charAt(z)) == Character.toLowerCase(searchedTextBuilder .charAt(index)))
            {
                counter++;
                index++;
            }
            else
            {
                index++;
                if (index % mySearchedString.length() == 0)
                {
                    index = 0;
                }
                break;
             }
        }
        if (counter == mySearchedString.length() - 1) // A match
        {
            spannableString.setSpan(new ForegroundColorSpan(Color.RED), i,
                                i + mySearchedString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Do the change you want(In this case changing the fore ground color to red)
            index = 0;
            continue;
        }
        else
        {
            index = 0;
            continue;
        }
    }
}
myTextView.setText(spannableString);

}

  • 전체 TextView텍스트를StringBuilder .
  • 검색된 문자열을 StringBuilder.
  • 창녀 TextView텍스트를 내부에 저장SpannableString
  • 간단한 작업을 수행 String하여 TextView텍스트 내의 모든 인스턴스 를 찾고 도달하면 변경하십시오.
  • 의 텍스트 값을 설정 TextView받는 사람을 SpannableString.

1

내 사용 사례를 위해 Kotlin에서 유틸리티 기능을 구현했으며 다른 사람에게 유용 할 수도 있습니다.

fun getCusomTextWithSpecificTextWithDiffColor(textToBold: String, fullText: String,
                                                  targetColor: Int) =
            SpannableStringBuilder(fullText).apply {
                setSpan(ForegroundColorSpan(targetColor),
                        fullText.indexOf(textToBold),
                        (fullText.indexOf(textToBold) + textToBold.length),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }

사용 방법 :

context?.let {
        infoMessage.text = AppUtils.getCusomTextWithSpecificTextWithDiffColor(
                wordAsBold,
                completeSentence, ContextCompat.getColor(it, R.color.white))
    }

1

사용하다:

makeTextBold("Your order is accepted","accepted", textView);
makeTextBold("Your order is canceled","canceled", textView);

함수:

public static void makeTextBold(String sentence, String word, AppCompatTextView textView) {
    SpannableStringBuilder builder = new SpannableStringBuilder();
    int startIndex = sentence.indexOf(word.toLowerCase().trim());
    int endIndex = startIndex + word.toLowerCase().trim().length();
    SpannableString spannableString = new SpannableString(sentence);
    StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
    spannableString.setSpan(boldSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To make text Bold
    spannableString.setSpan(new ForegroundColorSpan(Color.RED), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To change color of text
    builder.append(spannableString);
    textView.setText(builder, TextView.BufferType.SPANNABLE);
}

0

나는 이것이 문자열에서 단어를 채색하는 데 더 읽기 쉽다고 생각하며 한 번 작성하기 때문에 아마도 조금 더 효율적일 것입니다

    String str  = YOUR_STRING
    Spannable s = new SpannableString(str);
    int start = str.indexOf(err_word_origin);
    int end =  start + err_word_origin.length();
    s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    YOUR_TEXT_VIEW.setText(s , TextView.BufferType.SPANNABLE);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.