런타임에 Android에서 텍스트의 일부를 굵게 만드는 방법은 무엇입니까?


97

ListView내 응용 프로그램에서이 같은 많은 문자열 요소가 name, experience, date of joining, 등 난 그냥 만들고 싶어 name대담한. 모든 문자열 요소는 단일 TextView.

내 XML :

<ImageView
    android:id="@+id/logo"
    android:layout_width="55dp"
    android:layout_height="55dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="15dp" >
</ImageView>

<TextView
    android:id="@+id/label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/logo"
    android:padding="5dp"
    android:textSize="12dp" >
</TextView>

ListView 항목의 TextView를 설정하는 내 코드 :

holder.text.setText(name + "\n" + expirience + " " + dateOfJoininf);

답변:


230

TextView전화 가 있다고 가정 해 봅시다 etx. 그런 다음 다음 코드를 사용합니다.

final SpannableStringBuilder sb = new SpannableStringBuilder("HELLOO");

final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); // Span to make text bold
final StyleSpan iss = new StyleSpan(android.graphics.Typeface.ITALIC); //Span to make text italic
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold 
sb.setSpan(iss, 4, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make last 2 characters Italic

etx.setText(sb);


2
Xamarin의 경우 다음과 같이 사용var bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold);
Elisabeth

Xamarin의 경우etx.TextFormatted = sb;
Darius

27

Imran Rana의 답변 에 따라 여러 언어 (인덱스가 가변적 임)를 지원 StyleSpan하여 여러 TextViews에 s를 적용해야하는 경우 일반적이고 재사용 가능한 방법이 있습니다 .

void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style) {
    SpannableStringBuilder sb = new SpannableStringBuilder(text);
    int start = text.indexOf(spanText);
    int end = start + spanText.length();
    sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    textView.setText(sb);
}

다음 Activity과 같이 사용하십시오 .

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    StyleSpan boldStyle = new StyleSpan(Typeface.BOLD);
    setTextWithSpan((TextView) findViewById(R.id.welcome_text),
        getString(R.string.welcome_text),
        getString(R.string.welcome_text_bold),
        boldStyle);

    // ...
}

strings.xml

<string name="welcome_text">Welcome to CompanyName</string>
<string name="welcome_text_bold">CompanyName</string>

결과:

CompanyName에 오신 것을 환영합니다.


12

여기에 제공된 답변은 정확하지만 StyleSpan개체가 단일 연속 범위 (여러 범위에 적용 할 수있는 스타일이 아님) 이기 때문에 루프에서 호출 할 수 없습니다 . setSpan동일한 굵은 체로 여러 번 호출 하면 하나의 굵은 범위StyleSpan 가 생성 되고 상위 범위에서 이동합니다.

필자의 경우 (검색 결과 표시) 모든 검색 키워드의 모든 인스턴스를 굵게 표시해야했습니다. 이것이 내가 한 일입니다.

private static SpannableStringBuilder emboldenKeywords(final String text,
                                                       final String[] searchKeywords) {
    // searching in the lower case text to make sure we catch all cases
    final String loweredMasterText = text.toLowerCase(Locale.ENGLISH);
    final SpannableStringBuilder span = new SpannableStringBuilder(text);

    // for each keyword
    for (final String keyword : searchKeywords) {
        // lower the keyword to catch both lower and upper case chars
        final String loweredKeyword = keyword.toLowerCase(Locale.ENGLISH);

        // start at the beginning of the master text
        int offset = 0;
        int start;
        final int len = keyword.length(); // let's calculate this outside the 'while'

        while ((start = loweredMasterText.indexOf(loweredKeyword, offset)) >= 0) {
            // make it bold
            span.setSpan(new StyleSpan(Typeface.BOLD), start, start+len, SPAN_INCLUSIVE_INCLUSIVE);
            // move your offset pointer 
            offset = start + len;
        }
    }

    // put it in your TextView and smoke it!
    return span;
}

위의 코드는 한 키워드가 다른 키워드의 하위 문자열 인 경우 이중 굵게 표시를 건너 뛸만큼 똑똑하지 않습니다. 당신이 검색하는 경우 예를 들어, "물고기 Fi를" 내부 "를 fisty 바다에서 물고기" 그것은 할 것 "물고기"를 한 번 대담하고 "파이" 부분을. 좋은 점은 비효율적이고 다소 바람직하지 않지만 표시된 결과가 여전히 다음과 같이 보이기 때문에 시각적 인 단점이 없다는 것입니다.

물고기 에서 ES 과학 촌의 바다



6

Kotlin 및 buildSpannedString확장 기능을 사용하여 수행 할 수 있습니다.core-ktx

 holder.textView.text = buildSpannedString {
        bold { append("$name\n") }
        append("$experience $dateOfJoining")
 }

5

굵게 만들려는 텍스트 부분 앞의 텍스트 길이를 정확히 모르거나 굵게 표시 할 텍스트 길이를 모르는 경우에도 다음과 같은 HTML 태그를 쉽게 사용할 수 있습니다.

yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after"));

0

케이스 및 분음 부호 무감각을 지원하기 위해 Frieder의 답변을 확장합니다.

public static String stripDiacritics(String s) {
        s = Normalizer.normalize(s, Normalizer.Form.NFD);
        s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
        return s;
}

public static void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style, boolean caseDiacriticsInsensitive) {
        SpannableStringBuilder sb = new SpannableStringBuilder(text);
        int start;
        if (caseDiacriticsInsensitive) {
            start = stripDiacritics(text).toLowerCase(Locale.US).indexOf(stripDiacritics(spanText).toLowerCase(Locale.US));
        } else {
            start = text.indexOf(spanText);
        }
        int end = start + spanText.length();
        if (start > -1)
            sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        textView.setText(sb);
    }

0

@ srings / your_string 주석을 사용하는 경우 strings.xml 파일에 액세스하고 <b></b>원하는 텍스트 부분 에서 태그를 사용하십시오 .

예:

    <string><b>Bold Text</b><i>italic</i>Normal Text</string>

-1

CDATA와 함께 strings.xml 파일을 사용하는 것이 좋습니다.

<string name="mystring"><![CDATA[ <b>Hello</b> <i>World</i> ]]></string>

그런 다음 Java 파일에서 :

TextView myTextView = (TextView) this.findViewById(R.id.myTextView);
myTextView.setText(Html.fromHtml( getResources().getString(R.string.mystring) ));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.