在 android 4.4 上使用本地字体无效

Using local fonts on android 4.4 is not working

我正在尝试列出所有 available.Everything 的字体似乎在 android Oreo 上工作正常..但是当我在我的选项卡上测试它时它不起作用,尽管 android 团队表示 api 14 及更高版本支持此功能...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<Spinner
    android:id="@+id/size_spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >

</Spinner>

<RadioGroup
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <RadioButton
        android:id="@+id/amatic_regular"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/amatic_font"
        android:gravity="center"
        android:text="Amatic"
        android:textSize="25sp" />

    <RadioButton
        android:id="@+id/annie_use_your_telescope"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/annie_use_your_telescope"
        android:gravity="center"
        android:text="annie telescope"
        android:textSize="25sp" />
    <RadioButton
        android:id="@+id/Windsong"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/windsong"
        android:gravity="center"
        android:text="Windsong"
        android:textSize="25sp" />

    <RadioButton
        android:id="@+id/cac_champagne"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/cac_champagne"
        android:gravity="center"
        android:text="Cac champangne"
        android:textSize="25sp" />

    <RadioButton
        android:id="@+id/fff_tsuj"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/fff_tsuj"
        android:gravity="center"
        android:text="fff ttsu"
        android:textSize="25sp" />

    <RadioButton
        android:id="@+id/cavier_dream_font"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/cavier_dream_font"
        android:gravity="center"
        android:text="Cavier Font"
        android:textSize="25sp" />

    <RadioButton
        android:id="@+id/roboto_regular"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/roboto_regular"
        android:gravity="center"
        android:text="Robboto"
        android:textSize="25sp" />

    <RadioButton
        android:id="@+id/SEASRN__"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/seasran__"
        android:gravity="center"
        android:text="seasrn"
        android:textSize="25sp" />

    <RadioButton
        android:id="@+id/Capture_it"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/capture_it"
        android:gravity="center"
        android:text="capture it"
        android:textSize="25sp" />

    <RadioButton
        android:id="@+id/OpenSans-Light"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:fontFamily="@font/opensans_regular"
        android:gravity="center"
        android:text="OpenSans Light"
        android:textSize="25sp" />

</RadioGroup>

That's what I get in android Oreo

That's what I get in android kitkat

我不知道你在哪里听说 Android 4.4 及更高版本支持字体资源,但这是错误的。

@font 资源直到 Android Oreo:

才被添加

Android 8.0 (API level 26) introduces a new feature, Fonts in XML, which lets you use fonts as resources. You can add the font file in the res/font/ folder to bundle fonts as resources. These fonts are compiled in your R file and are automatically available in Android Studio. You can access the font resources with the help of a new resource type, font. For example, to access a font resource, use @font/myfont, or R.font.myfont.

之前添加了fontFamily属性,但受限于available fonts,直到API26才随字体资源发布。在 API 下面的 API 26 中,您必须以编程方式设置自定义字体。

因此,对于 Android 牛轧糖及更低版本,您必须以编程方式进行设置。 @font 资源仅在 Oreo 和更新版本上受支持。

您可以使用如下方式检查当前 API:if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)

然后首先使用它加载它,当然还有你的文件名:

Typeface quicksand = Typeface.createFromAsset(c.getAssets(),
            "Quicksand-Bold.ttf");

最后,设置它:

someTextview.setTypeface(quicksand);

您仍然可以将属性保留在 XML 文件中。 XML 给定 API 级别上不存在的标签在构建时会被简单地忽略,因此您仍然可以在 API 26 及以上

期间保留它

除非

您使用了支持库。如果你使用支持库,俗称AppCompat1,你可以使用它。例如:

<?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:fontStyle="normal" android:fontWeight="400" android:font="@font/myfont-Regular"
          app:fontStyle="normal" app:fontWeight="400" app:font="@font/myfont-Regular"/>
    <font android:fontStyle="italic" android:fontWeight="400" android:font="@font/myfont-Italic"
          app:fontStyle="italic" app:fontWeight="400" app:font="@font/myfont-Italic" />
</font-family>

There's a section in the docs about it 读起来也不错。

你还需要这个依赖(写这个的时候版本是最新的,为了以后使用,你可能要查找最新版本的support lib):

compile "com.android.support:appcompat-v7:27.0.2"

support libraries是出于etc原因的support dependencies的集合,但是AppCompat library是向后兼容的support library,就是这里引用的那个