web-dev-qa-db-fra.com

Les polices personnalisées avec Support Library ne fonctionnent pas sur un périphérique réel

J'ai utilisé des polices personnalisées avec l'API 26 de la bibliothèque de support. J'ai créé une famille de polices à l'aide de styles et ajouté un style à ma vue de texte. J'ai constaté que la police allait être définie dans Aperçu lors de la conception, mais ne fonctionnait pas dans les appareils Android réels. Ci-dessous, mon code et j'ai également joint une capture d'écran. Merci d'avance.

Affichage:

<TextView
    Android:id="@+id/card_number_text"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:text="111 5235 5563 8845"
    Android:gravity="left"
    Android:layout_marginRight="8dp"
    app:layout_constraintRight_toRightOf="parent"
    Android:layout_marginTop="8dp"
    style="@style/creditCardText"
    app:layout_constraintTop_toBottomOf="@+id/payableLayout"
    app:layout_constraintLeft_toLeftOf="@+id/payableLayout"
    app:layout_constraintHorizontal_bias="0.0" />

Style.xml:

<style name="creditCardText">
    <item name="Android:textSize">@dimen/textSizeLarge</item>
    <item name="Android:fontFamily">@font/font_roboto_medium</item>
    <item name="Android:textColor">@color/color_card_number</item>
</style>

Famille de polices: 

<font-family xmlns:Android="http://schemas.Android.com/apk/res/Android">
<font
    Android:fontStyle="normal"
    Android:fontWeight="400"
    Android:font="@font/roboto_medium" />

build.gradle:

apply plugin: 'com.Android.application'
buildscript {
    repositories {
    }
    dependencies {
   }
}

Android {
    signingConfigs {
    }
   compileSdkVersion 26
   defaultConfig {
        applicationId "org.saifintex.skypaytrans"
        minSdkVersion 18
        targetSdkVersion 26
        vectorDrawables.useSupportLibrary = true
        versionCode 7
        multiDexEnabled true
        versionName "1.6"
        testInstrumentationRunner 
        "Android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
   }

lintOptions {
    abortOnError false        // true by default
    checkAllWarnings false
    checkReleaseBuilds false
    ignoreWarnings true       // false by default
    quiet true                // false by default
}

repositories {
    maven { url "https://jitpack.io" }
}
dexOptions {
    javaMaxHeapSize "4g"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'

    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
}
productFlavors {
}
sourceSets {
    main {
        assets.srcDirs = ['src/main/assets', 'src/main/assets/']
        Java.srcDirs = ['src/main/Java', 'src/main/Java/fonts']
    }
  }
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')

androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', 
{
    exclude group: 'com.Android.support', module: 'support-annotations'
})
compile "com.Android.support:appcompat-v7:26.1.0"
compile "com.Android.support:design:26.1.0"
compile "com.Android.support:recyclerview-v7:26.1.0"
compile project(':tooltip')
compile project(':mylibrary')
compile fileTree(include: ['*.jar'], dir: 'libs')
compile "com.j256.ormlite:ormlite-
Android:${rootProject.ormliteAndroidVersion}"
compile "com.j256.ormlite:ormlite-core:${rootProject.ormliteCoreVersion}"
testCompile 'junit:junit:4.12'
compile 'com.afollestad.material-dialogs:core:0.9.4.2'
compile 'com.fasterxml.jackson.core:jackson-core:2.7.2'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.2'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.2'
compile 'com.soundcloud.Android:android-crop:1.0.1@aar'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.Android.volley:volley:1.0.0'
compile 'commons-codec:commons-codec:1.10'
compile 'com.Android.support:design:26.1.0'
compile 'com.squareup.picasso:picasso:2.4.0'
compile 'com.google.firebase:firebase-messaging:11.0.1'
compile 'com.google.firebase:firebase-core:11.0.1'
compile 'com.Android.support:cardview-v7:26.1.0'
compile 'com.Android.support:support-v4:26.1.0'
compile 'com.wang.avi:library:2.1.3'
compile 'com.github.ayalma:ExpandableRecyclerView:0.2.0'
compile 'com.github.deano2390:MaterialShowcaseView:1.1.0'
compile 'com.Android.support.constraint:constraint-layout:1.0.2'
compile 'com.google.firebase:firebase-crash:11.0.1'
compile 'com.google.firebase:firebase-auth:11.0.1'
compile 'com.google.Android.gms:play-services-analytics:11.0.1'
compile 'com.alimuzaffar.lib:pinentryedittext:1.3.1'
androidTestImplementation 'com.Android.support.test:runner:1.0.1'
androidTestImplementation 'com.Android.support.test.espresso:espresso-
core:3.0.1'
testCompile 'junit:junit:4.12'
}

configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    def requested = details.requested
    if (requested.group == 'com.Android.support') {
        if (!requested.name.startsWith("multidex") && 
        !requested.name.startsWith("crash")) {
            details.useVersion '25.3.1'
        }
    }
}
}

apply plugin: 'com.google.gms.google-services'

Répertoire de ressources de police:

 enter image description here

Aperçu de la conception: Ici la police fonctionne

 enter image description here

Capture d'écran du périphérique Android: Ici la police ne fonctionne pas

 enter image description here

11
Yogesh Srivastava

Changez votre TextView en Android.support.v7.widget.AppCompatTextView.

Voir https://stackoverflow.com/a/45208134/332798

27
tmm1

Exigence

  • 1) dossier des actifs qui a le sous-dossier "/ fonts"

  • 2) requièrent des fichiers ".ttf" de polices personnalisées dans le dossier/polices.

  • 3) enum

  • 4) fichier attrs.xml

  • 5) classe Java

  • 6) utilisation


1) Créer un dossier d’actifs dans

src/main/assets

2) Ajouter des polices personnalisées dans

src/main/assets/fonts/

3) enum

import Android.annotation.SuppressLint;
import Android.content.Context;


@SuppressLint("StaticFieldLeak")
public enum Fonts {

OpenSans_Bold("OpenSans-Bold.ttf", 0),
OpenSans_BoldItalic("OpenSans-BoldItalic.ttf", 1),
OpenSans_CondBold("OpenSans-CondBold.ttf", 2),
OpenSans_CondLight("OpenSans-CondLight.ttf", 3),
OpenSans_CondLightItalic("OpenSans-CondLightItalic.ttf", 4),
OpenSans_ExtraBold("OpenSans-ExtraBold.ttf", 5),
OpenSans_ExtraBoldItalic("OpenSans-ExtraBoldItalic.ttf", 6),
OpenSans_Italic("OpenSans-Italic.ttf", 7),
OpenSans_Light("OpenSans-Light.ttf", 8),
OpenSans_LightItalic("OpenSans-LightItalic.ttf", 9),
OpenSans_Regular("OpenSans-Regular.ttf", 10),
OpenSans_Semibold("OpenSans-Semibold.ttf", 11),
OpenSans_SemiboldItalic("OpenSans-SemiboldItalic.ttf", 12),

AudioWide_Regular("Audiowide_Regular.ttf", 13);

String stringValue;
int value;
Context context;

Fonts(Context context) {
    this.context = context;
}

Fonts(String toString, int value) {
    stringValue = toString;
    this.value = value;
}

@Override
public String toString() {
    return "fonts/" + stringValue;
}

}

4) Fichier attrs.xml

créer attrs.xml dans le dossier res/values

<resources>
<declare-styleable name="FontTextView">

    <attr name="customFont" format="enum">
        <enum name="OpenSans_Bold" value="0" />
        <enum name="OpenSans_BoldItalic" value="1" />
        <enum name="OpenSans_CondBold" value="2" />
        <enum name="OpenSans_CondLight" value="3" />
        <enum name="OpenSans_CondLightItalic" value="4" />
        <enum name="OpenSans_ExtraBold" value="5" />
        <enum name="OpenSans_ExtraBoldItalic" value="6" />
        <enum name="OpenSans_Italic" value="7" />
        <enum name="OpenSans_Light" value="8" />
        <enum name="OpenSans_LightItalic" value="9" />
        <enum name="OpenSans_Regular" value="10" />
        <enum name="OpenSans_Semibold" value="11" />
        <enum name="OpenSans_SemiboldItalic" value="12" />
        <enum name="Audiowide_Regular" value="13" />

    </attr>

</declare-styleable>


5) FontTextView.Java

import Android.annotation.SuppressLint;
import Android.content.Context;
import Android.content.res.TypedArray;
import Android.graphics.Typeface;
import Android.util.AttributeSet;
import Android.util.Log;
import Android.widget.TextView;
import com.example.Fonts;
import com.example.R;

@SuppressLint("AppCompatCustomView")
public class FontTextView extends TextView {

public FontTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context, attrs);
}

public FontTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

public FontTextView(Context context) {
    super(context);
}

private void init(Context context, AttributeSet attrs) {

    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.FontTextView, 0, 0);

    String fontText = a.getString(R.styleable.FontTextView_customFont);

    if (fontText != null) {
        switch (fontText) {
            case "0":
                fontText = Fonts.OpenSans_Bold.toString();
                break;
            case "1":
                fontText = Fonts.OpenSans_BoldItalic.toString();
                break;
            case "2":
                fontText = Fonts.OpenSans_CondBold.toString();
                break;
            case "3":
                fontText = Fonts.OpenSans_CondLight.toString();
                break;
            case "4":
                fontText = Fonts.OpenSans_CondLightItalic.toString();
                break;
            case "5":
                fontText = Fonts.OpenSans_ExtraBold.toString();
                break;
            case "6":
                fontText = Fonts.OpenSans_ExtraBoldItalic.toString();
                break;
            case "7":
                fontText = Fonts.OpenSans_Italic.toString();
                break;
            case "8":
                fontText = Fonts.OpenSans_Light.toString();
                break;
            case "9":
                fontText = Fonts.OpenSans_LightItalic.toString();
                break;
            case "10":
                fontText = Fonts.OpenSans_Regular.toString();
                break;
            case "11":
                fontText = Fonts.OpenSans_Semibold.toString();
                break;
            case "13":
                fontText = Fonts.AudioWide_Regular.toString();
                break;
            case "12":
                fontText = Fonts.OpenSans_SemiboldItalic.toString();
                break;
            default:
                fontText = Fonts.OpenSans_Regular.toString();
                break;
        }

        Log.e("String", fontText);
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), fontText);

        setTypeface(tf);
    }
    a.recycle();
}

}

6) Utilisation

    <com.example.FontTextView
         Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:padding="10sp"
        Android:text="this is custom font"
        Android:textSize="20sp"
        app:customFont="OpenSans_Semibold" />

ajoutez l'espace de noms ci-dessous aux principaux parents. Layout of xml file xmlns: app = "http://schemas.Android.com/apk/res-auto"

référence par:

"Android Custom TypeFace fontFamily "

cliquez ici

avec cela, vous pouvez facilement ajouter n'importe quelle police dans Android.

2
Dhiren

Si vous utilisez l'injection de vue butterknife pour lier votre texte personnalisé ou votre vue par bouton, vous devez remplacer la méthode onFinishInflate() dans la classe de vue personnalisée.
Par exemple:

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    Typeface font_type = Typeface.createFromAsset(getContext().getAssets(), "fonts/" + fontStyle);
    this.setTypeface(font_type);
}
0
Caner Yılmaz

Pour le Android support lib ci-dessous api 26, vous pouvez utiliser ceci:

create class TypefaceUtil.Java et ajoute le code ci-dessous

public class TypefaceUtil {
    public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
        try {
            final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

            final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
            defaultFontTypefaceField.setAccessible(true);
            defaultFontTypefaceField.set(null, customFontTypeface);
        } catch (Exception e) {
        }
    }
}

... et dans votre classe d'application qui étend Application class, ajoutez ceci:

 @Override
    public void onCreate() {
        super.onCreate();

        TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/myfont.ttf");
    }

... Android ajoute cette classe à manifest.xml

Android:name=".MyApplication"

... et à la fin, ajoutez cette ligne dans votre style: 

<item name="Android:typeface">serif</item>

mais cela ne fonctionne pas avec la bibliothèque de support api 26 et supérieur Pour cela, vous pouvez utiliser cette version.

  1. créer un dossier nommé fonte dans le dossier res
  2. mettez votre police dans ce dossier
  3. créez un fichier xml (fichier de ressource de police) (myfont.xml) et ajoutez ce code:

    <font Android:fontStyle="normal" Android:fontWeight="400" Android:font="@font/font"
        app:fontStyle="normal" app:fontWeight="400" app:font="@font/font"/>
    
    <font Android:fontStyle="italic" Android:fontWeight="400" Android:font="@font/font"
        app:fontStyle="italic" app:fontWeight="400" app:font="@font/font" />
    

... et ajoutez maintenant cette ligne dans le code de style de votre application:

<item name="Android:fontFamily">@font/myfont</item>

J'espère que cela fonctionne pour vous.

0
Fahimi

J'ai passé des heures à essayer de comprendre pourquoi la police ne fonctionnait pas. J'essayais de migrer de la bibliothèque Calligraphy et vous devez désactiver la configuration de police par défaut dans la classe Application.

setDefaultFontPath(app.getString(R.string.font_path_medium))

Remplacez la configuration de police par défaut par ceci.

<style name="AppTheme" parent="AppBaseTheme">
    <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">your_front</item>
</style>

<style name="RobotoButtonStyle" parent="Android:Widget.Button">
    <item name="Android:fontFamily">your_font</item>
</style>
0
Rubin Yoo

Un peu tard pour la fête, mais j’ai rencontré un problème avec l’utilisation de fontFamily dans FragmentActivities. Dans ces activités, la police n'est pas correctement affichée. Si vous laissez votre activité s'étendre depuis AppCompatActivity (qui étend FragmentActivity), la police est correctement affichée.

0
Rik van Velzen