cách tạo một văn bản cụ thể trên TextView BOLD


251

Tôi không biết làm thế nào để biến một văn bản cụ thể trên TextView thành BÓNG.

nó như thế này

txtResult.setText(id+" "+name);

Tôi muốn đầu ra là như thế này:

1111 neil

idnamelà các biến mà tôi đã lấy giá trị từ cơ sở dữ liệu và tôi muốn làm idđậm, nhưng chỉ idđể namekhông bị ảnh hưởng, tôi không biết làm thế nào để làm điều này.



4 cách - chuỗi cụ thể trên đậm TextView - Chắc chắn sẽ giúp bạn.
c49

Câu trả lời:


379

Chỉ cần xây dựng Chuỗi của bạn trong HTML và đặt nó:

String sourceString = "<b>" + id + "</b> " + name; 
mytextview.setText(Html.fromHtml(sourceString));

5
Vì fromHtml (sourceString) không được dùng trong API 24, bạn phải sử dụng mã tiếp theo: Thời lượng được kéo dài; if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {thời gian được định hướng = } other {termsSpned = Html.fromHtml (thời gian định dạng); }
Mladen Rakonjac

2
Đây là tùy chọn duy nhất sẽ hoạt động nếu bạn đang bản địa hóa ứng dụng của mình.
howettl

Đây là một giải pháp tốt nhưng tôi phát hiện ra rằng nó không hoạt động đối với giải pháp <và> @ wtsang02 là tối ưu hơn
Omar Boshra

Nó không hoạt động với <NẾU bạn sử dụng String.format, UNLESS bạn cũng thoát khỏi dấu ngoặc, như được mô tả ở đây .
Yusuf X

5
Html.fromHtml()hiện không được chấp nhận
Ai đó ở đâu đó vào

384

Trong khi bạn có thể sử dụng Html.fromHtml (), bạn có thể sử dụng một cách tiếp cận nguyên gốc hơn đó là SpannableStringBuilder , bài đăng này có thể hữu ích.

SpannableStringBuilder str = new SpannableStringBuilder("Your awesome text");
str.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), INT_START, INT_END, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView tv=new TextView(context);
tv.setText(str);

Nếu câu trả lời này không hoạt động, hãy thử nối văn bản của bạn với chuỗi có thể mở rộng, một số thứ như: mSpannable.append (yourremainedtext);
Gowtham Kumar 9/03/2015

10
Đối với những người đến từ Google không có kiến ​​thức trước: INT_START / INT_END là vị trí bắt đầu và kết thúc phần in đậm.
Tiêu điểm

2
nếu bạn chỉ cần áp dụng một số đánh dấu cho chuỗi nguồn mà không thay đổi nó, thì tốt hơn bạn nên sử dụng lớp
SpannableString

26
Điều này sẽ hoàn toàn phá vỡ nếu bạn cần bản địa hóa bản sao của mình. INT_START và INT_END sẽ là các vị trí khác nhau trong các nội địa hóa khác nhau.
howettl

4
Cố gắng hiểu những gì mã đang làm khi nghi ngờ. Số int start là số bạn xác định, là chỉ số bắt đầu của nhịp. Hãy thử 0 để bắt đầu, chuỗi. (). Size () cho kết thúc.
wtsang02

85

Đầu tiên: Bạn không cần lo lắng về việc sử dụng mã hiệu suất chậm từ câu trả lời của Raghav Sood .

Thứ hai: Bạn không cần phải viết một hàm mở rộng được cung cấp bởi câu trả lời của w3bshark khi sử dụng Kotlin.

Finnaly: Tất cả những gì bạn cần làm là sử dụng thư viện android-ktx của Kotlin từ Google (tham khảo tại đây để tìm thêm thông tin và cách đưa nó vào dự án của bạn):

// Suppose id = 1111 and name = neil (just what you want). 
val s = SpannableStringBuilder()
          .bold { append(id) } 
          .append(name)
txtResult.setText(s) 

Sản xuất: 1111 neil


CẬP NHẬT:

Bởi vì tôi nghĩ rằng nó có thể giúp đỡ người khác cũng như để chứng minh bạn có thể đi bao xa ở đây là nhiều trường hợp sử dụng hơn.

  • Khi bạn cần hiển thị một văn bản với một số phần màu xanh lam và in nghiêng:

    val myCustomizedString = SpannableStringBuilder()
        .color(blueColor, { append("A blue text ") })
        .append("showing that ")
        .italic{ append("it is painless") }
  • Khi bạn cần hiển thị một văn bản in đậm và in nghiêng:

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

Nói tóm lại, bold, append, coloritaliclà chức năng mở rộng SpannableStringBuilder. Bạn có thể thấy một chức năng mở rộng khác trong tài liệu chính thức , từ đó bạn có thể nghĩ cho các khả năng khác.


Điều này là tuyệt vời và tất cả nhưng tôi nghĩ rằng mọi câu trả lời liên quan đến chuỗi nên xem xét các bản dịch. Các từ trong câu có thể được sắp xếp và cấu trúc hoàn toàn khác nhau trong một số ngôn ngữ vì vậy việc thêm vào như thế này không phải lúc nào cũng có thể áp dụng trong một số tình huống. Cũng không lý tưởng cho những thứ như chuỗi số lượng trong XML.
Edward van Raak

1
@CoolMind Nó không khiến bạn không thể sử dụng Android KTX. Bạn có thể tìm thông tin từ github.com/android/android-ktx về cách báo cáo lỗi, đưa ra đề xuất tính năng hoặc đóng góp cho thư viện đó. Vì vậy, nó vẫn là một tài liệu tham khảo hợp lệ. Tôi đã cập nhật câu trả lời của mình để bao gồm thêm thông tin về thư viện và cách sử dụng nó trong dự án của bạn.
Filipe Brito

1
cho anh chàng này một huy chương cho giải pháp và tài nguyên hiện đại này !! cảm ơn!!!
Sjd

37

Tôi nghĩ rằng câu trả lời được chọn không cung cấp một kết quả thỏa đáng. Tôi đã viết hàm riêng của mình trong đó có 2 chuỗi; Toàn văn và một phần của văn bản bạn muốn làm đậm.

Nó trả về một SpannableStringBuilder với chữ 'textToBold' từ 'text' được in đậm.

Tôi tìm thấy khả năng làm cho một chuỗi con in đậm mà không gói nó trong các thẻ hữu ích.

    /**
     * Makes a substring of a string bold.
     * @param text          Full text
     * @param textToBold    Text you want to make bold
     * @return              String with bold substring
     */

    public static SpannableStringBuilder makeSectionOfTextBold(String text, String textToBold){

        SpannableStringBuilder builder=new SpannableStringBuilder();

        if(textToBold.length() > 0 && !textToBold.trim().equals("")){

            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textToBold.toLowerCase(Locale.US);
            int startingIndex = testText.indexOf(testTextToBold);
            int endingIndex = startingIndex + testTextToBold.length();
            //for counting start/end indexes

            if(startingIndex < 0 || endingIndex <0){
                return builder.append(text);
            }
            else if(startingIndex >= 0 && endingIndex >=0){

                builder.append(text);
                builder.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0);
            }
        }else{
            return builder.append(text);
        }

        return builder;
  }

Bạn có thể cung cấp một ví dụ về cách sử dụng mã này?
Micro

2
@MicroR Bạn cần vượt qua hai Chuỗi, Chuỗi thứ hai cần phải là một phần của văn bản chứa trong chuỗi đầu tiên. ví dụ: makeSectionOfTextBold ("Đây là một số văn bản tuyệt vời.", "tuyệt vời").
Leon

1
bạn nên thay đổi câu lệnh if của mình bằng if (textToBold! = null &&! textToBold.isEmpty ())
Arda Kara

2
Hàm này không mong đợi chuỗi con có thể xảy ra trong toàn văn nhiều lần. Ví dụ: trong "Tên người dùng của tôi là tên", nó không thể in đậm "tên" thứ 2.
Jadamec

1
Sau đó, phương thức này thực sự nên được đặt tên là makeAllBold (text, textToBold).
wtsang02

29

Như wtsang02 đã nói, sử dụng HTML là một chi phí đắt đỏ. Chỉ cần sử dụng giải pháp bản địa. Nếu bạn không phải sửa đổi chuỗi, chỉ cần sử dụng SpannableString, không phải SpannableStringBuilder.

String boldText = "id";
String normalText = "name";
SpannableString str = new SpannableString(boldText + normalText);
str.setSpan(new StyleSpan(Typeface.BOLD), 0, boldText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(str);

23

Trong trường hợp bạn muốn sử dụng chuỗi từ XML, bạn có thể làm một cái gì đó như thế này:

String.xml (phần "CDATA" rất quan trọng, nếu không nó sẽ không hoạt động)

<string name="test">
     <![CDATA[
 <b>bold!</b> normal
    ]]>
</string>

tập tin bố trí

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_gravity="center" />

</FrameLayout>

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

Điều này làm việc cho tôi <string name="test"><b>text bold</b> other text</string>. Không hoạt động nếu tôi viết<![CDATA[
sara

@sara Đã thử nghiệm lại ngay bây giờ, trên Pixel 2 với Q. Hoạt động tốt. Ở đây, tôi đã cập nhật cách thức hoạt động với Kotlin. Vui lòng thử lại.
nhà phát triển Android

Đây là câu trả lời chấp nhận được nếu bạn sử dụng phông chữ tùy chỉnh. Kudus cho người kỵ sĩ.
Raghul Sugathan

13

Nó đơn giản chỉ cần đóng văn bản được chỉ định như thế này chẳng hạn <b>"your text here:"</b>

<string name="headquarters">"<b>"Headquarters:"</b>" Mooresville, North Carolina, U.S.</string>

kết quả: Trụ sở chính: Mooresville, Bắc Carolina, Hoa Kỳ


Điều này chỉ hoạt động nếu chuỗi được sử dụng từ xml. Nếu chuỗi này được gọi là lập trình, mã hóa html sẽ bị loại bỏ.
Starwave

11

Nếu bạn đang sử dụng Kotlin, việc sử dụng nó trở nên dễ dàng hơn core-ktx vì nó cung cấp ngôn ngữ dành riêng cho tên miền (DSL) để thực hiện việc này:

val string: SpannedString = buildSpannedString {
    bold {
        append("foo")
    }
    append("bar")     
}

Các tùy chọn khác được cung cấp bởi nó là:

append("Hello There")
bold {
    append("bold")
    italic {
        append("bold and italic")
        underline {
            append("then some text with underline")
        }
    }
}

Cuối cùng, bạn có thể chỉ để:

textView.text = string

10

Đây là giải pháp tốt hơn nếu bạn muốn làm cho nhiều văn bản in đậm. Tôi đã cải thiện mã của Eitan. cảm ơn Eitan

public static SpannableStringBuilder makeSectionOfTextBold(String text, String... textToBold) {
    SpannableStringBuilder builder = new SpannableStringBuilder(text);

    for (String textItem :
            textToBold) {
        if (textItem.length() > 0 && !textItem.trim().equals("")) {
            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textItem.toLowerCase(Locale.US);
            int startingIndex = testText.indexOf(testTextToBold);
            int endingIndex = startingIndex + testTextToBold.length();

            if (startingIndex >= 0 && endingIndex >= 0) {
                builder.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0);
            }
        }
    }

    return builder;
}

8

Dựa trên câu trả lời của @ mladj0ni, tôi đã nhận được mã dưới đây để làm việc. Vấn đề là nếu bạn sử dụng String.format , nó sẽ loại bỏ đánh dấu html, do đó bạn phải thoát các ký hiệu ngoặc trong String.xml:

chuỗi XML:

<string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>

code.java:

String unspanned = String.format(Locale.US, "%s%s", getResources().getString(R.string. welcome_messages), 99);

Spanned spanned;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    spanned = Html.fromHtml(unspanned, Html.FROM_HTML_MODE_LEGACY);
} else {
    spanned = Html.fromHtml(unspanned);
}

textView.setText(spanned);

Nó đơn giản hơn SpannableStringBuilder. Về hiệu suất, nếu bạn chỉ hiển thị một chuỗi, thì người dùng sẽ không nhận thấy thêm một phần nghìn giây để phân tích cú pháp.

Xem tài liệu ở đây .


Cảm ơn vì & lt; b> ... & lt; / b>
trói

4

Bạn có thể sử dụng mã này để đặt một phần văn bản của bạn thành đậm. Đối với bất cứ điều gì ở giữa các thẻ html đậm, nó sẽ làm cho nó đậm.

String myText = "make this <b>bold</b> and <b>this</b> too";
textView.setText(makeSpannable(myText, "<b>(.+?)</b>", "<b>", "</b>"));

public SpannableStringBuilder makeSpannable(String text, String regex, String startTag, String endTag) {

            StringBuffer sb = new StringBuffer();
            SpannableStringBuilder spannable = new SpannableStringBuilder();

            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(text);
            while (matcher.find()) {
                sb.setLength(0);
                String group = matcher.group();
                String spanText = group.substring(startTag.length(), group.length() - endTag.length());
                matcher.appendReplacement(sb, spanText);

                spannable.append(sb.toString());
                int start = spannable.length() - spanText.length();

                spannable.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), start, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            sb.setLength(0);
            matcher.appendTail(sb);
            spannable.append(sb.toString());
            return spannable;
        }

3
public static Spanned getBoldString(String textNotBoldFirst, String textToBold, String textNotBoldLast) {
    String resultant = null;

    resultant = textNotBoldFirst + " " + "<b>" + textToBold + "</b>" + " " + textNotBoldLast;

    return Html.fromHtml(resultant);

}

Thử cái này. Nó có thể giúp chắc chắn


3

Tạo char đầu tiên của chuỗi có thể mở rộng trong khi tìm kiếm char trong danh sách / trình tái chế như

r a vi và ajay

trước đây làm nổi bật như thế này nhưng tôi muốn được như thế dưới đây

ravi một Ajay nd HOẶC ravi và một jay

Đối với điều này, tôi đã tìm kiếm độ dài từ nếu nó bằng 1, tôi tách chuỗi chính thành các từ và tính toán vị trí bắt đầu từ sau đó tôi tìm kiếm từ bắt đầu bằng char.

 public static SpannableString colorString(int color, String text, String... wordsToColor) {
    SpannableString coloredString = new SpannableString(text);

    for (String word : wordsToColor) {

        Log.e("tokentoken", "-wrd len-" + word.length());
        if (word.length() !=1) {
            int startColorIndex = text.toLowerCase().indexOf(word.toLowerCase());
            int endColorIndex = startColorIndex + word.length();
            try {
                coloredString.setSpan(new ForegroundColorSpan(color), startColorIndex, endColorIndex,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            } catch (Exception e) {
                e.getMessage();
            }
        } else {
            int start = 0;

            for (String token : text.split("[\u00A0 \n]")) {
                if (token.length() > 0) {
                    start = text.indexOf(token, start);
                   // Log.e("tokentoken", "-token-" + token + "   --start--" + start);
                    char x = token.toLowerCase().charAt(0);
                    char w = word.toLowerCase().charAt(0);
                   // Log.e("tokentoken", "-w-" + w + "   --x--" + x);

                    if (x == w) {
                        // int startColorIndex = text.toLowerCase().indexOf(word.toLowerCase());
                        int endColorIndex = start + word.length();
                        try {
                            coloredString.setSpan(new ForegroundColorSpan(color), start, endColorIndex,
                                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

                        } catch (Exception e) {
                            e.getMessage();
                        }
                    }
                }
            }

        }

    }

    return coloredString;
}

3

Tôi đến đây để cung cấp một giải pháp cập nhật hơn, vì tôi không hài lòng với các câu trả lời hiện có. Tôi cần một cái gì đó sẽ hoạt động cho các văn bản dịch và không có hiệu suất sử dụng Html.fromHtml(). Nếu bạn đang sử dụng Kotlin, đây là một chức năng mở rộng sẽ dễ dàng đặt nhiều phần văn bản của bạn thành đậm . Điều này hoạt động giống như Markdown và có thể được mở rộng để hỗ trợ các thẻ Markdown khác, nếu cần.

val yourString = "**This** is your **string**.".makePartialTextsBold()
val anotherString = getString(R.string.something).makePartialTextsBold()

/**
 * This function requires that the parts of the string that need
 * to be bolded are wrapped in ** and ** tags
 */
fun String.makePartialTextsBold(): SpannableStringBuilder {
    var copy = this
    return SpannableStringBuilder().apply {
        var setSpan = true
        var next: String
        do {
            setSpan = !setSpan
            next = if (length == 0) copy.substringBefore("**", "") else copy.substringBefore("**")
            val start = length
            append(next)
            if (setSpan) {
                setSpan(StyleSpan(Typeface.BOLD), start, length,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }
            copy = copy.removePrefix(next).removePrefix("**")
        } while (copy.isNotEmpty())
    }
}

3

wtsang02Câu trả lời là cách tốt nhất để tìm hiểu về nó, vì, Html.fromHtml ("") hiện không được chấp nhận. Ở đây tôi sẽ tăng cường một chút cho bất cứ ai đang gặp vấn đề trong việc tự động làm cho từ đầu tiên được in đậm, bất kể kích thước của câu là gì.

Đầu tiên cho phép tạo một phương thức để có được từ đầu tiên:

 private String getFirstWord(String input){

    for(int i = 0; i < input.length(); i++){

        if(input.charAt(i) == ' '){

            return input.substring(0, i);
        }
    }

    return input;
}

Bây giờ hãy nói rằng bạn có một chuỗi dài như thế này:

String sentence = "friendsAwesomeName@gmail.com want's to be your friend!"

Và bạn muốn câu của bạn giống như của bạnAwgieName @ gmail muốn trở thành bạn của bạn! Tất cả những gì bạn phải làm là - lấy FirstWord và lấy chiều dài của nó để làm cho FirstWord trở nên đậm nét, đại loại như thế này:

String myFirstWord = getFirstWord(sentence);
int start = 0; // bold will start at index 0
int end = myFirstWord.length(); // and will finish at whatever the length of your first word

Bây giờ chỉ cần làm theo các bước của wtsang02 , như thế này:

SpannableStringBuilder fancySentence = new SpannableStringBuilder(sentence);
fancySentence.setSpan(new android.text.style.StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(fancySentence);

Và đó là nó! Bây giờ bạn có thể in đậm một từ với bất kỳ kích thước nào từ câu dài / ngắn. Hy vọng nó sẽ giúp được ai đó, hạnh phúc mã hóa :)


3

Đây là chức năng mở rộng Kotlin tôi sử dụng cho việc này

/**
 * Sets the specified Typeface Style on the first instance of the specified substring(s)
 * @param one or more [Pair] of [String] and [Typeface] style (e.g. BOLD, ITALIC, etc.)
 */
fun TextView.setSubstringTypeface(vararg textsToStyle: Pair<String, Int>) {
    val spannableString = SpannableString(this.text)
    for (textToStyle in textsToStyle) {
        val startIndex = this.text.toString().indexOf(textToStyle.first)
        val endIndex = startIndex + textToStyle.first.length

        if (startIndex >= 0) {
            spannableString.setSpan(
                StyleSpan(textToStyle.second),
                startIndex,
                endIndex,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            )
        }
    }
    this.setText(spannableString, TextView.BufferType.SPANNABLE)
}

Sử dụng:

text_view.text="something bold"
text_view.setSubstringTypeface(
    Pair(
        "something bold",
        Typeface.BOLD
    )
)

.

text_view.text="something bold something italic"
text_view.setSubstringTypeface(
    Pair(
        "something bold ",
        Typeface.BOLD
    ),
    Pair(
        "something italic",
        Typeface.ITALIC
    )
)

2

Bạn có thể thêm hai chuỗi riêng biệt trong trình tạo, một trong số chúng là spnedString, chuỗi còn lại là chuỗi thông thường. Cách này bạn không phải tính toán các chỉ mục.

val instructionPress = resources?.getString(R.string.settings_press)

val okText = resources?.getString(R.string.ok)
val spannableString = SpannableString(okText)

val spannableBuilder = SpannableStringBuilder()
spannableBuilder.append(instructionPress)
spannableBuilder.append(spannableString, StyleSpan(Typeface.BOLD), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

instructionText.setText(spannableBuilder,TextView.BufferType.SPANNABLE)

2

nếu vị trí của văn bản in đậm được cố định (ví dụ: if ở đầu textView), thì sử dụng hai textView khác nhau với cùng một nền. Sau đó, bạn có thể làm cho textStyle của textView khác được in đậm.

Điều này sẽ đòi hỏi gấp đôi bộ nhớ so với một textView nhưng tốc độ sẽ tăng lên.


1

Tôi đã tạo một phương thức tĩnh để thiết lập một phần văn bản Bold cho TextView và EditText

public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex){
        if(!contentData.isEmpty() && contentData.length() > endIndex) {
            final SpannableStringBuilder sb = new SpannableStringBuilder(contentData);

            final StyleSpan bss = new StyleSpan(Typeface.BOLD); // Span to make text bold
            final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text normal
            sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
            sb.setSpan(iss,endIndex, contentData.length()-1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);

            if(mView instanceof TextView)
               ((TextView) mView).setText(sb);
            else if(mView instanceof EditText)
               ((EditText) mView).setText(sb);

        }
    }

Một mã tùy chỉnh khác

  /*typeFaceStyle can be passed as 

    Typeface.NORMAL = 0;
    Typeface.BOLD = 1;
    Typeface.ITALIC = 2;
    Typeface.BOLD_ITALIC = 3;*/

    public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex,int typeFaceStyle){
        if(!contentData.isEmpty() && contentData.length() > endIndex) {
            final SpannableStringBuilder sb = new SpannableStringBuilder(contentData);

            final StyleSpan bss = new StyleSpan(typeFaceStyle); // Span to make text bold
            final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text italic
            sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
            sb.setSpan(iss,endIndex,contentData.length()-1,Spanned.SPAN_INCLUSIVE_INCLUSIVE);

            if(mView instanceof TextView)
                ((TextView) mView).setText(sb);
            else if(mView instanceof EditText)
                ((EditText) mView).setText(sb);
        }
    }

1

Trong trường hợp ai đó đang sử dụng Data Binding. Chúng ta có thể định nghĩa bộ điều hợp ràng buộc như thế này

@BindingAdapter("html")
fun setHtml(view: TextView, html: String) {
    view.setText(HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY))
}

Sau đó, chúng ta có thể sử dụng nó trên TextView

app:html="@{@string/bold_text}"

in đậm

<string name="bold_text"><![CDATA[Part of text is <b>bold</b>]]></string>

Bạn viết hàm "setHtml" ở đâu?
nhà phát triển Android

developer.android.com/topic/lologists/data-binding/ Từ Về cơ bản, đó là bất kỳ lớp nào, miễn là bạn có chú thích
logcat

Ồ, điều này thật kỳ lạ đối với tôi. Cảm ơn bạn. Bạn có biết có lẽ một hướng dẫn / mẫu tốt đẹp cho người mới của chủ đề này?
nhà phát triển Android

Tôi không biết hướng dẫn. Chỉ cần google "android BindingAd CHƯƠNG"
logcat

1

Tìm thấy một cách trong trường hợp bạn muốn xử lý nội địa hóa bằng nhiều ngôn ngữ, thật nhàm chán để làm nhưng nó hoạt động, giả sử chúng tôi muốn điều này:

Bằng tiếng Anh:

Không có thanh toán đăng ký

Trong tiếng Tây Ban Nha:

Không hay Pagos registrados

Bạn phải tạo 3 chuỗi

Tiếng Anh:

<string name="start_string">There are no</string>
<string name="middle_string">payments</string>
<string name="end_string">registered.</string>
<string name="string_format" translatable="false">%1$s %2$s %3$s</string>

Người Tây Ban Nha:

<string name="start_string">No hay</string>
<string name="middle_string">pagos</string>
<string name="end_string">registrados</string>

Bây giờ bạn có thể làm điều này:

val startSpanPosition = getString(R.string.start_string).length
val endSpanPosition = startSpanPosition + getString(R.string.middle_string).length
val mySpannableString = SpannableStringBuilder(String.format(getString(R.string.string_format),
        getString(R.string.start_string), getString(R.string.middle_string))), getString(R.string.end_string)))

mySpannableString.setSpan(StyleSpan(Typeface.BOLD), spanStartPosition, endSpanPosition, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

1

Tài nguyên chuỗi của bạn

<resources>
   <string name="your_string_resource_name">This is normal text<![CDATA[<b> but this is bold </b>]]> and <![CDATA[<u> but this is underline text</u>]]></string>
</resources> 

lớp java của bạn

yourtextView.setText(getString(R.string.your_string_resource_name));

0

Đây là giải pháp hoàn chỉnh của tôi cho các giá trị Chuỗi động với trường hợp kiểm tra.

/**
 * Makes a portion of String formatted in BOLD.
 *
 * @param completeString       String from which a portion needs to be extracted and formatted.<br> eg. I am BOLD.
 * @param targetStringToFormat Target String value to format. <br>eg. BOLD
 * @param matchCase Match by target character case or not. If true, BOLD != bold
 * @return A string with a portion formatted in BOLD. <br> I am <b>BOLD</b>.
 */
public static SpannableStringBuilder formatAStringPortionInBold(String completeString, String targetStringToFormat, boolean matchCase) {
    //Null complete string return empty
    if (TextUtils.isEmpty(completeString)) {
        return new SpannableStringBuilder("");
    }

    SpannableStringBuilder str = new SpannableStringBuilder(completeString);
    int start_index = 0;

    //if matchCase is true, match exact string
    if (matchCase) {
        if (TextUtils.isEmpty(targetStringToFormat) || !completeString.contains(targetStringToFormat)) {
            return str;
        }

        start_index = str.toString().indexOf(targetStringToFormat);
    } else {
        //else find in lower cases
        if (TextUtils.isEmpty(targetStringToFormat) || !completeString.toLowerCase().contains(targetStringToFormat.toLowerCase())) {
            return str;
        }

        start_index = str.toString().toLowerCase().indexOf(targetStringToFormat.toLowerCase());
    }

    int end_index = start_index + targetStringToFormat.length();
    str.setSpan(new StyleSpan(BOLD), start_index, end_index, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return str;
}

Ví dụ. CompleteString = "Tôi đang ĐÓNG"

TRƯỜNG HỢP I nếu *targetStringToFormat* = "bold"*matchCase* = true

trả về "Tôi là ĐẬM" (vì đậm! = ĐẬM)

TRƯỜNG HỢP II nếu *targetStringToFormat* = "bold"*matchCase* = false

trả về "Tôi là ĐẬM "

Để áp dụng:

myTextView.setText(formatAStringPortionInBold("I am BOLD", "bold", false))

Mong rằng sẽ giúp!

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.