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:
Aperçu de la conception: Ici la police fonctionne
Capture d'écran du périphérique Android: Ici la police ne fonctionne pas
Changez votre TextView en Android.support.v7.widget.AppCompatTextView.
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 "
avec cela, vous pouvez facilement ajouter n'importe quelle police dans Android.
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);
}
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.
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.
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>
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.