Как использовать указанные значения для шрифтов в XML

Используя функцию " Шрифты в XML", вы можете указать различные веса шрифтов для семейства шрифтов. Например:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto">

    <font android:font="@font/archivo_narrow_regular" android:fontWeight="400" android:fontStyle="normal"
        app:font="@font/archivo_narrow_regular" app:fontWeight="400" app:fontStyle="normal"/>

    <font android:font="@font/archivo_narrow_regular_italic" android:fontWeight="400" android:fontStyle="italic"
        app:font="@font/archivo_narrow_regular_italic" app:fontWeight="400" app:fontStyle="italic"/>

    <font android:font="@font/archivo_narrow_medium" android:fontWeight="500" android:fontStyle="normal"
        app:font="@font/archivo_narrow_medium" app:fontWeight="500" app:fontStyle="normal"/>

    <font android:font="@font/archivo_narrow_medium_italic" android:fontWeight="500" android:fontStyle="italic"
        app:font="@font/archivo_narrow_medium_italic" app:fontWeight="500" app:fontStyle="italic"/>

    <font android:font="@font/archivo_narrow_semibold" android:fontWeight="600" android:fontStyle="normal"
        app:font="@font/archivo_narrow_semibold" app:fontWeight="600" app:fontStyle="normal"/>

    <font android:font="@font/archivo_narrow_semibold_italic" android:fontWeight="600" android:fontStyle="italic"
        app:font="@font/archivo_narrow_semibold_italic" app:fontWeight="600" app:fontStyle="italic"/>

    <font android:font="@font/archivo_narrow_bold" android:fontWeight="700" android:fontStyle="normal"
        app:font="@font/archivo_narrow_bold" app:fontWeight="700" app:fontStyle="normal"/>

    <font android:font="@font/archivo_narrow_bold_italic" android:fontWeight="700" android:fontStyle="italic"
        app:font="@font/archivo_narrow_bold_italic" app:fontWeight="700" app:fontStyle="italic"/>

</font-family>

Но я не могу понять, как на самом деле использовать каждый из этих весов; либо в файле XML (макет/стиль), либо в коде Java. Их атрибут fontWeight недоступен для TextView, а объект Typeface созданный из ResourcesCompat.getFont(context, R.font.archivo_narrow), не упоминает веса шрифтов.

Я понимаю, что могу просто указать конкретный ресурс шрифта (т.е. R.font.archivo_narrow_semibold), но тогда какой смысл иметь атрибут fontWeight в семействе font-family?


Обновить

В API Level 28 был добавлен новый статический метод create(Typeface family, int weight, boolean italic) вместе с getWeight() экземпляра getWeight(). Наконец, это позволяет использовать атрибут fontWeight в коде Java; хотя только для API уровня 28 и выше, я не нашел никаких аналогов в библиотеке поддержки.

Это полезно - и показывает, что атрибут fontWeight в fontWeight не служил какой-либо цели, но я действительно хотел бы иметь возможность использовать вес в стиле XML.

Ответ 1

Как указывает @FlorianWalther, атрибут textFontWeight - это именно то, что я искал. Этот атрибут был явно добавлен на уровне API 28, но до недавнего времени не был задокументирован.

Убедитесь, что все веса находятся в одном и том же XML файле (как в моем вопросе), а затем просто используйте атрибут вместе с атрибутом fontFamily.

<TextView android:id="@+id/weightedTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/archivo_narrow"
    android:textFontWeight="700"/>

Насколько мне известно, этот атрибут доступен только в API уровня 28 и выше, я буду обновлять информацию, если найду его аналог в библиотеке поддержки.

Ответ 2

Он выглядит как android, следуя веб-стандартам для управления шрифтами и размерами для приложения для Android.

Свойство font-weight используется для определения веса шрифта, например, обычного или полужирного.

Но для всех других весов используется численный диапазон от 100 до 900. Одна из проблем с веб-шрифтами заключается в том, что большинство веб-браузеров неправильно поддерживают шрифты шрифтов, отличные от обычных и полужирный. Следующая диаграмма описывает возможные сопоставления весов с числовыми определениями:

100    Extra Light or Ultra Light
200    Light or Thin
300    Book or Demi
400    Normal or Regular
500    Medium
600    Semibold, Demibold
700    Bold
800    Black, Extra Bold or Heavy
900    Extra Black, Fat, Poster or Ultra Black

Вы можете больше узнать о весе шрифта здесь


cc_montserrat_bold.xml

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <font
        android:font="@font/montserrat_bold"
        android:fontStyle="normal"
        android:fontWeight="700"
        app:font="@font/montserrat_bold"
        app:fontStyle="normal"
        app:fontWeight="700" />
    <font
        android:font="@font/montserrat_bolditalic"
        android:fontStyle="italic"
        android:fontWeight="700"
        app:font="@font/montserrat_bolditalic"
        app:fontStyle="italic"
        app:fontWeight="700" />

</font-family>

cc_montserrat_regular.xml

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <font
        android:font="@font/montserrat_regular"
        android:fontStyle="normal"
        android:fontWeight="400"
        app:font="@font/montserrat_regular"
        app:fontStyle="normal"
        app:fontWeight="400" />
    <font
        android:font="@font/montserrat_italic"
        android:fontStyle="italic"
        android:fontWeight="400"
        app:font="@font/montserrat_italic"
        app:fontStyle="italic"
        app:fontWeight="400" />


</font-family>

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

val textView = dialog.findViewById<TextView>(android.R.id.message) as TextView
val typeface = ResourcesCompat.getFont(context,R.font.cc_montserrat_regular)
        textView.typeface = typeface

Скриншот Android Project:

enter image description here

Ответ 3

здесь, как вы можете использовать различные шрифты шрифтов в студии Android

  1. Открыть app/src/main/res/layout/you_awesome_layout.xml
  2. Перейдите на Design tab
  3. На панели Component Tree откройте TextView и выберите View all attributes внизу правого меню
  4. На панели "Атрибуты" откройте раскрывающийся список fontFamily и выберите " More Fonts…
  5. Выбрать семейство YouFontFamilyName
  6. Выберите стиль Regular/Bold/Semibold/Black/WhateverStyleYouHaveThere

Вуаля, я думаю, что это единственный способ добиться того, чего вы хотите

Ответ 4

Изменение: это не решение запроса:/

Я нашел класс Typeface.Builder, который, как я думаю, вам нужен. К сожалению, он доступен только с уровня API 26 и выше. Возможно, вскоре появится библиотека совместимости.

https://developer.android.com/reference/android/graphics/Typeface.Builder.html

 Typeface.Builder buidler = new Typeface.Builder("your_font_file.ttf");
 builder.setFontVariationSettings("'wght' 700, 'slnt' 20, 'ital' 1");
 builder.setWeight(700);  // Tell the system that this is a bold font.
 builder.setItalic(true);  // Tell the system that this is an italic style font.
 Typeface typeface = builder.build();