как сделать конкретный текст на TextView BOLD


253

Я не знаю, как сделать конкретный текст на TextView стать жирным шрифтом.

это вот так

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

Я хочу, чтобы вывод был таким:

1111 Нил

idи nameявляются переменными, которые я получил значение из базы данных, и я хочу сделать idжирным шрифтом, но только idтак, nameчтобы не повлияло, я понятия не имею, как это сделать.



Ответы:


380

Просто создайте свою строку в HTML и установите ее:

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

5
Поскольку fromHtml (sourceString) устарел в API 24, вы должны использовать следующий код: Spanned durationSpanned; if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {durationSpanned = Html.fromHtml (durationFormatted, Html.FROM_HTML_MODE_LEGACY); } else {durationSpanned = Html.fromHtml (durationFormatted); }
Младен Раконджак,

2
Это единственный вариант, который будет работать, если вы локализуете свое приложение.
Howettl

Это хорошее решение, но я обнаружил, что оно не работает для решения <and> @ wtsang02, более оптимального
Омар Бошра

Он не работает с <ЕСЛИ вы используете String.format, ЕСЛИ БЕЗ и вы не выходите за скобки, как описано здесь .
Юсуф Х

5
Html.fromHtml()сейчас устарела
Кто-то где-то

385

Хотя вы можете использовать Html.fromHtml (), вы можете использовать более нативный подход - SpannableStringBuilder , но этот пост может быть бесполезным.

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

Если этот ответ не работает, попробуйте добавить ваш текст с помощью spannable строки, например: mSpannable.append (yourremainingtext);
Гаутам Кумар

11
Для людей, пришедших из Google без предварительного знания: INT_START / INT_END - это место, где жирный шрифт должен начинаться и заканчиваться.
Прожектор

2
если вам нужно только применить некоторую разметку к исходной строке, не изменяя ее, то вам лучше использовать класс
SpannableString

26
Это полностью сломается, если вам нужно локализовать вашу копию. INT_START и INT_END будут разными позициями в разных локализациях.
Howettl

5
Постарайтесь понять, что делает код, когда сомневаетесь. Int int - это определяемое вами число, которое является начальным индексом диапазона. Попробуйте 0 для начала, string. (). Size () для конца.
wtsang02

86

Первое: вам не нужно беспокоиться об использовании медленного кода из ответа Рагхав Суда .

Второе: вам не нужно писать функцию расширения, предоставленную ответом w3bshark при использовании Kotlin.

Finnaly: все, что вам нужно сделать, это использовать библиотеку Kotlin android-ktx от Google (обратитесь сюда, чтобы узнать больше информации и как включить ее в ваш проект):

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

Производит: 1111 Нил


ОБНОВИТЬ:

Потому что я думаю, что это может помочь кому-то еще, а также продемонстрировать, как далеко вы можете зайти, здесь больше вариантов использования.

  • Когда вам нужно отобразить текст с некоторыми частями синим и курсивом:

    val myCustomizedString = SpannableStringBuilder()
        .color(blueColor, { append("A blue text ") })
        .append("showing that ")
        .italic{ append("it is painless") }
  • Когда вам нужно отобразить текст жирным шрифтом и курсивом:

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

Короче говоря, bold, append, colorи italicявляются функциями расширения для SpannableStringBuilder. Вы можете увидеть другие функции расширения в официальной документации , откуда вы можете подумать о других возможностях.


Это здорово, и все, но я думаю, что каждый ответ, связанный со строками, должен учитывать переводы. Слова в предложениях могут быть упорядочены и структурированы совершенно по-разному в некоторых языках, поэтому добавление, подобное этому, не всегда применимо в определенных ситуациях. Также не идеально подходит для таких вещей, как количество строк в XML.
Эдвард ван Раак

1
@CoolMind Это не мешает вам использовать Android KTX. Вы можете найти информацию на github.com/android/android-ktx о том, как сообщить об ошибке, сделать предложение о функции или внести свой вклад в эту библиотеку. Таким образом, это все еще действительная ссылка. Я обновил свой ответ, чтобы включить больше информации о библиотеке и о том, как использовать ее в вашем проекте.
Филипе Брито

1
дайте этому парню медаль за это современное решение и ресурс !! Спасибо!!!
SJD

37

Я думал, что выбранный ответ не дал удовлетворительного результата. Я написал свою собственную функцию, которая принимает 2 строки; Полный текст и часть текста, которую вы хотите выделить жирным шрифтом.

Он возвращает SpannableStringBuilder с пометкой «textToBold» из «текста».

Я считаю полезным сделать подстроку жирной, не оборачивая ее тегами.

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

Можете ли вы привести пример того, как использовать это в коде?
Микро

2
@MicroR Вам нужно передать две строки, вторая строка должна быть частью текста, содержащейся в первой. например, makeSectionOfTextBold («Это отличный текст.», «отличный»).
Леон

1
Вы должны изменить свой оператор if с помощью if (textToBold! = null &&! textToBold.isEmpty ())
Арда Кара

2
Эта функция не ожидает, что подстрока может встречаться в тексте несколько раз. Например, в «Моё имя пользователя есть имя» он не может сделать второе «имя» жирным.
Jadamec

1
Тогда этот метод должен быть назван makeAllBold (text, textToBold).
wtsang02

30

Как сказал wtsang02, использование HTML требует больших затрат. Просто используйте родное решение. Если вам не нужно изменять строку, просто используйте SpannableString, а не 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

Если вы хотите использовать строку из XML, вы можете сделать что-то вроде этого:

strings.xml (часть «CDATA» важна, иначе она не будет работать)

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

файл макета

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

Это работает для меня <string name="test"><b>text bold</b> other text</string>. Не работает , если я пишу<![CDATA[
Sara

@sara Протестировано снова, на Pixel 2 с Q. Работает нормально. Здесь я обновил, как это работает с Kotlin. Пожалуйста, попробуйте еще раз.
разработчик Android

Это приемлемый ответ, если вы используете пользовательские шрифты. Кудус к создателю.
Рагхул Сугатан

12

Это просто, просто закройте указанный текст, например, так <b>"your text here:"</b>

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

Результат: Штаб-квартира: Мурсвилл, Северная Каролина, США


Это работает, только если строка используется из XML. Если эта строка вызывается программно, кодировка html удаляется.
Starwave

11

Если вы используете Kotlin, это становится еще проще core-ktx, поскольку он предоставляет язык предметной области (DSL) для этого:

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

Больше возможностей, предоставляемых этим:

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

Наконец, вы можете просто:

textView.text = string

10

Вот лучшее решение, если вы хотите сделать несколько текстов жирным шрифтом. Я улучшил код Эйтана. спасибо Эйтан.

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

9

Основываясь на ответе @ mladj0ni, я получил приведенный ниже код для работы. Проблема заключалась в том, что если вы используете String.format , он удаляет разметку html, поэтому вам нужно экранировать символы скобок в strings.xml:

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

Это проще, чем SpannableStringBuilder. Что касается производительности, если вы отображаете только одну строку, то пользователь не заметит лишнюю миллисекунду для ее анализа.

Смотрите документацию здесь .


Спасибо за & lt; b> ... & lt; / b>
окисленный

4

Вы можете использовать этот код, чтобы выделить часть текста жирным шрифтом. Для всего, что находится между жирным html-тегами, оно станет жирным.

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

}

Попробуй это. Это может помочь определенно


3

Сделать первый символ строки включаемым при поиске символа в списке / рециркуляторе, например

г VI и Аджай

предварительно выделив, как это, но я хотел быть, как показано ниже

Ravi й Аджай ИЛИ Ravi и джей

для этого я искал длину слова, если она равна 1, я разделял основную строку на слова и вычислял начальную позицию слова, затем искал слово, начинающееся с символа.

 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

Я пришел сюда, чтобы предоставить более современное решение, потому что я не был удовлетворен существующими ответами. Мне нужно что-то, что будет работать для переведенных текстов и не имеет производительности использования Html.fromHtml(). Если вы используете Kotlin, здесь есть функция расширения, которая легко выделит жирным шрифтом несколько частей вашего текста . Это работает так же, как Markdown, и может быть расширен для поддержки других тегов Markdown, если это необходимо.

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

Ответ wtsang02 - лучший способ сделать это, так как теперь Html.fromHtml ("") устарел. Здесь я просто собираюсь немного его улучшить для тех, у кого возникают проблемы с динамическим выделением жирным шрифтом первого слова, независимо от размера предложения.

Сначала давайте создадим метод, чтобы получить первое слово:

 private String getFirstWord(String input){

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

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

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

    return input;
}

Теперь предположим, что у вас есть длинная строка, подобная этой:

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

И вы хотите, чтобы ваше предложение было похоже на yourAwesomeName@gmail.com , чтобы оно было вашим другом! Все, что вам нужно сделать, - это набрать первое слово и набрать длину, чтобы жирное слово было первым, примерно так:

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

Теперь просто следуйте инструкциям wtsang02 , например:

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

И это все! Теперь вы должны иметь возможность выделять слово любого размера из длинного / короткого предложения. Надеюсь, это поможет кому-то, счастливое кодирование :)


3

Это функция расширения Kotlin, которую я использую для этого

/**
 * 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)
}

Использование:

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

Вы можете добавить две строки отдельно в компоновщик, одна из которых - spannedString, другая - обычная. Таким образом, вам не нужно рассчитывать индексы.

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

если положение полужирного текста является фиксированным (например, если находится в начале textView), то используйте два разных textView с одинаковым фоном. Затем вы можете сделать текстовый стиль другого textView жирным.

Это потребует вдвое больше памяти по сравнению с одним textView, но скорость увеличится.


1

Я создал статический метод для установки части текста Bold для TextView и 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);

        }
    }

Еще один более индивидуальный код

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

В случае, если кто-то использует привязку данных. Мы можем определить привязку адаптера, как это

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

Тогда мы можем использовать его в TextView

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

где bold_text

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

Где вы пишете функцию "setHtml"?
Android-разработчик

developer.android.com/topic/libraries/data-binding/… Это в основном любой класс, если у вас есть аннотация
logcat

О, это так странно для меня. Спасибо. Знаете ли вы, возможно, хороший учебник / образец для новичков в этой теме?
Android-разработчик

Я не знаю учебников. Просто Google "Android BindingAdapter"
logcat

1

Найден способ, если вы хотите обрабатывать локализацию на нескольких языках, скучно это делать, но это работает, давайте предположим, что мы хотим этого:

По-английски:

Нет зарегистрированных платежей

На испанском:

Нет сена Pagos registrados

Вы должны создать 3 строки

Английский:

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

Испанский:

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

Теперь вы можете сделать это:

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

Ваш строковый ресурс

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

ваш класс Java

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

0

Вот мое полное решение для динамических значений String с проверкой регистра.

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

Например. completeString = "Я BOLD"

В случае, если *targetStringToFormat* = "bold"и*matchCase* = true

возвращает "Я жирный" (жирный! = Жирный)

Случай II, если *targetStringToFormat* = "bold"и*matchCase* = false

возвращает "Я BOLD "

Применять:

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

Надеюсь, это поможет!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.