[android] Android : TextView.setText ()를 사용하여 문자열의 일부를 색칠합니까?

.setText ( “”) 메서드를 통해 TextView보기의 텍스트를 변경하는 동시에 텍스트의 일부를 채색 (또는 굵게, 기울임 꼴, 투명 등)하고 나머지는 변경하지 않으려 고합니다. 예를 들면 :

title.setText("Your big island <b>ADVENTURE!</b>";

위의 코드가 올바르지 않다는 것을 알고 있지만 달성하고 싶은 것을 설명하는 데 도움이됩니다. 어떻게해야합니까?



답변

스팬을 사용 합니다.

예:

final SpannableStringBuilder sb = new SpannableStringBuilder("your text here");

// Span to set text color to some RGB value
final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(158, 158, 158));

// Span to make text bold
final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD);

// Set the text color for first 4 characters
sb.setSpan(fcs, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

// make them also bold
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

yourTextView.setText(sb);


답변

title.setText(Html.fromHtml("Your big island <b>ADVENTURE!</b>"));


답변

이 정보가 도움이 되었기를 바랍니다 (다국어 지원).

<string name="test_string" ><![CDATA[<font color="%1$s"><b>Test/b></font>]]> String</string>

그리고 자바 코드에서 다음을 수행 할 수 있습니다.

int color = context.getResources().getColor(android.R.color.holo_blue_light);
String string = context.getString(R.string.test_string, color);
textView.setText(Html.fromHtml(string));

이렇게하면 “테스트”부분 만 색상이 지정되고 굵게 표시됩니다.


답변

다음은 단어의 모든 발생 (대소 문자 구분 안 함)을 찾아 빨간색으로 표시하는 예입니다.

String notes = "aaa AAA xAaax abc aaA xxx";
SpannableStringBuilder sb = new SpannableStringBuilder(notes);
Pattern p = Pattern.compile("aaa", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(notes);
while (m.find()){
    //String word = m.group();
    //String word1 = notes.substring(m.start(), m.end());

    sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
editText.setText(sb);


답변

a Spannable를 사용하여 텍스트의 특정 부분에 특정 측면을 제공 할 수 있습니다 . 원하시면 예를 찾아 볼 수 있습니다.

아, 바로 여기에서 stackoverflow .

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


답변

Kotlin을 사용하는 경우 android-ktx 라이브러리를 사용하여 다음을 수행 할 수 있습니다.

val title = SpannableStringBuilder()
        .append("Your big island ")
        .bold { append("ADVENTURE") }

titleTextField.text = title

bold확장 기능입니다 SpannableStringBuilder. 사용할 수있는 작업 목록은 여기 에서 설명서를 참조하십시오 .

또 다른 예:

val ssb = SpannableStringBuilder()
            .color(green) { append("Green text ") }
            .append("Normal text ")
            .scale(0.5F) { append("Text at half size ") }
            .backgroundColor(green) { append("Background green") }

green해결 된 RGB 색상은 어디에 있습니까 ?

스팬을 중첩하여 임베디드 DSL과 같은 결과를 얻을 수도 있습니다.

bold { underline { italic { append("Bold and underlined") } } }

build.gradle작동하려면 앱 모듈 수준에서 다음이 필요합니다 .

repositories {
    google()
}

dependencies {
    implementation 'androidx.core:core-ktx:0.3'
}


답변

HTML을 사용하려면 다음을 사용해야합니다. TextView.setText(Html.fromHtml(String htmlString))

자주 / 반복적으로 수행하고 싶다면 내가 작성한 클래스 ( SpannableBuilder )를 볼 수 있습니다. Html.fromHtml()별로 효율적이지 않습니다 (내부에서 큰 xml 구문 분석 기계를 사용하고 있음). 이 블로그 게시물에 설명되어 있습니다.