Семейство шрифтов не работает на Android Lollipop

Я хочу установить шрифт без засечек в качестве шрифта по умолчанию в своем приложении. Я работаю над устройством Android Lollipop. Итак, это мой styles.xml:

<resources>

    <style name="AppBaseTheme" parent="android:Theme.Material.Light.DarkActionBar">

    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
        <item name="android:buttonStyle">@style/RobotoButtonStyle</item>


    </style>

    <style name="RobotoTextViewStyle" parent="android:Widget.TextView">
        <item name="android:fontFamily">sans-serif-light</item>
    </style>

    <style name="RobotoButtonStyle" parent="android:Widget.Button">
        <item name="android:fontFamily">sans-serif-light</item>
    </style>

</resources>

Когда я запускаю приложение на своем устройстве, свет без засечек не применяется в каждом представлении. Например, TextViews в ActivityMain.java отображаются с нужным мне шрифтом, но в других действиях, таких как SecondActivity.java, все TextViews отображаются нормально. Если я запускаю свое приложение на устройстве с Android 4.1, оно работает в любом представлении. Что я делаю неправильно? Заранее спасибо :)


person Kurtis92    schedule 26.11.2014    source источник


Ответы (1)


Если использование темы Material Design для вас не важно, вы можете использовать это:

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="android:typeface">sans-serif-light</item>
</style>

Если использование материальной темы важно для вашего приложения, вы можете использовать следующую технику:

import java.lang.reflect.Field;
import android.content.Context;
import android.graphics.Typeface;

public final class FontsOverride {

public static void setDefaultFont(Context context,
        String staticTypefaceFieldName, String fontAssetName) {
    final Typeface regular = Typeface.createFromAsset(context.getAssets(),
            fontAssetName);
    replaceFont(staticTypefaceFieldName, regular);
}

protected static void replaceFont(String staticTypefaceFieldName,
        final Typeface newTypeface) {
    try {
        final Field staticField = Typeface.class
                .getDeclaredField(staticTypefaceFieldName);
        staticField.setAccessible(true);
        staticField.set(null, newTypeface);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
}

Теперь перегрузите шрифты по умолчанию в классе приложения.

public final class Application extends android.app.Application {
@Override
public void onCreate() {
    super.onCreate();

    FontsOverride.setDefaultFont(this, "SANS_SERIF", "sans_serif_light.ttf");
}
}
person Vinay Gaba    schedule 18.03.2015
comment
Итак, это ошибка в Lollipop? - person rraallvv; 24.06.2019