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

时间:2017-12-09 20:41:34

标签: android android-4.4-kitkat android-fonts

我试图列出所有可用的字体。一切似乎在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

1 个答案:

答案 0 :(得分:1)

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

直到Android Oreo

才添加

@font个资源

  

Android 8.0(API级别26)引入了一项新功能,即XML中的字体,可让您将字体用作资源。您可以在res / font /文件夹中添加字体文件以将字体捆绑为资源。这些字体在您的R文件中编译,并在Android Studio中自动提供。您可以借助新的资源类型字体访问字体资源。例如,要访问字体资源,请使用@ font / myfont或R.font.myfont。

之前添加了fontFamily属性,但它被available fonts限制,直到API 26与字体资源一起发布。在API 26下面的API中,您必须以编程方式设置自定义字体。

因此,对于Android Nougat及更低版本,您必须以编程方式设置它。只有Oreo和更新版本支持@font资源。

您可以使用以下内容检查当前的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文件中。在构建时,根本不会忽略在给定API级别上不存在的XML标记,因此您仍可以将其保留在API 26及更高级别

除非

您使用支持库。如果使用支持库(通常称为AppCompat 1 ),则可以使用它。例如:

<?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也很好看。

您还需要此依赖项(在编写时,版本是最新版本。对于以后的使用,您可能需要查找最新版本的支持库):

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

由于其他原因,支持库是支持依赖项的集合,但AppCompat库是向后兼容性的支持库,并且是此处引用的