Как я могу установить слово как полужирный в TextView с fontFamily открытым без полужирного в Android? - PullRequest
1 голос
/ 22 января 2020

Мне нужна помощь, чтобы понять следующую проблему.

Мне нужно установить одно слово TextView жирным шрифтом.

У меня есть макет с TextView с идентификатором myTextView:

  <TextView
      android:id="@+id/myTextView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:fontFamily="@font/open_sans_semi_bold"
      android:textColor="#d94256"
      android:textSize="20sp" />

Я установил текст для этого представления программным способом следующим образом:

myTextView.text = HtmlCompat.fromHtml("My fancy string where I want to show this <b>word</b> bold", HtmlCompat.FROM_HTML_MODE_LEGACY)

Также я попытался использовать строительный построитель строк, но я получил результат этого изображения в обоих случаях.

Почему бы мне не получить что-то вроде этого ? Я получаю этот результат, когда меняю эту строку:

android:fontFamily="@font/open_sans_semi_bold"

для этой:

android:fontFamily="@font/open_sans_regular"

А также, если я установил

android:fontFamily="@font/open_sans_bold"

Я вижу этот результат

Я нашел ttf-файлы для open_sans_semi_bold , open_sans_bold и open_sans_regular в репозитории Google git.

Разве тег Html <b> не должен быть таким же жирным, как OpenSans Bold?

1 Ответ

0 голосов
/ 22 января 2020

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

@Nullable
public static Spannable highlightString(@NonNull String s, @NonNull String subString, int color) {

    int startPos = s.toLowerCase(Locale.getDefault()).indexOf(subString.toLowerCase(Locale.getDefault()));
    int endPos = startPos + subString.length();

    if (startPos != -1) {
        Spannable spannable = new SpannableString(s);
        ColorStateList colorStateList = new ColorStateList(new int[][]{new int[]{}}, new int[]{color});
        TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, colorStateList, null);
        try {
            spannable.setSpan(highlightSpan, startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return spannable;
    }
    else
        return null;
}

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

Spannable highlightedText = highlightString("My fancy string where I want to show this word bold", "word", Color.BLUE);
if (highlightedText != null)
    myTextView.setText(highlightedText);
...