Làm thế nào để tạo một phần của văn bản In đậm trong Android khi chạy?


97

Một ListViewtrong ứng dụng của tôi có rất nhiều yếu tố chuỗi như name, experience, date of joining, vv Tôi chỉ muốn làm cho nameđậm. Tất cả các phần tử chuỗi sẽ nằm trong một chuỗi duy nhất TextView.

XML của tôi:

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

Mã của tôi để đặt TextView của mục ListView:

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

Câu trả lời:


230

Giả sử bạn có một cuộc TextViewgọi etx. Sau đó, bạn sẽ sử dụng mã sau:

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
Đối với Xamarin, hãy sử dụng như thế nàyvar bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold);
Elisabeth

Đối với Xamarin,etx.TextFormatted = sb;
Darius

27

Dựa trên câu trả lời của Imran Rana, đây là một phương pháp chung, có thể sử dụng lại nếu bạn cần áp dụng StyleSpans cho một số TextViews, với sự hỗ trợ cho nhiều ngôn ngữ (trong đó các chỉ số có thể thay đổi):

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

Sử dụng nó Activitynhư vậy:

@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>

Kết quả:

Chào mừng đến với CompanyName


12

Các câu trả lời được cung cấp ở đây là đúng, nhưng không thể được gọi trong một vòng lặp vì StyleSpanđối tượng là một nhịp liền kề đơn lẻ (không phải một kiểu có thể áp dụng cho nhiều nhịp). Gọi setSpannhiều lần với cùng một dấu đậm StyleSpansẽ tạo ra một khoảng đậm và chỉ cần di chuyển nó xung quanh trong khoảng chính.

Trong trường hợp của tôi (hiển thị kết quả tìm kiếm), tôi cần làm cho tất cả các trường hợp của tất cả các từ khóa tìm kiếm xuất hiện in đậm. Đây là những gì tôi đã làm:

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

Hãy nhớ rằng đoạn mã ở trên không đủ thông minh để bỏ qua chữ in đậm kép nếu một từ khóa là chuỗi con của từ khóa kia. Ví dụ: nếu bạn tìm kiếm "Fish fi" bên trong "Fishes in the fisty Sea", nó sẽ làm đậm một lần "fish" và sau đó là phần "fi" . Điều tốt là mặc dù không hiệu quả và có một chút không mong muốn, nó sẽ không có nhược điểm về hình ảnh vì kết quả hiển thị của bạn sẽ trông giống như

ở biển fi sty


này, bạn có thể vui lòng xem stackoverflow.com/questions/59947482/…
Pemba Tamang

6

Bạn có thể làm điều đó bằng cách sử dụng Kotlin và buildSpannedStringchức năng mở rộng từcore-ktx

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

5

nếu bạn không biết chính xác độ dài của văn bản trước phần văn bản mà bạn muốn In đậm, hoặc thậm chí bạn không biết độ dài của văn bản được Bold, bạn có thể dễ dàng sử dụng các thẻ HTML như sau:

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

0

Mở rộng câu trả lời của Frieder để hỗ trợ trường hợp và dấu phụ vô cảm.

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

Nếu bạn đang sử dụng chú thích @ srings / your_string, hãy truy cập tệp string.xml và sử dụng <b></b>thẻ trong phần văn bản bạn muốn.

Thí dụ:

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

-1

Tôi khuyên bạn nên sử dụng tệp string.xml với CDATA

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

Sau đó, trong tệp java:

TextView myTextView = (TextView) this.findViewById(R.id.myTextView);
myTextView.setText(Html.fromHtml( getResources().getString(R.string.mystring) ));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.