web-dev-qa-db-ja.com

サポートライブラリを備えたカスタムフォントが実際のデバイスで機能しない

Support Library API 26でカスタムフォントを使用しました。スタイルを使用してフォントファミリを作成し、テキストビューにスタイルを追加しました。フォントはデザイン中にプレビューで設定されるが、Android実際のデバイスでは機能しません。以下は私のコードで、スクリーンショットも添付しています。事前に感謝します。

TextView:

<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>

フォントファミリー:

<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'

フォントリソースディレクトリ:

enter image description here

デザインプレビュー:ここでフォントが機能しています

enter image description here

Androidデバイスのスクリーンショット:ここでフォントは機能していません

enter image description here

15

TextViewをAndroid.support.v7.widget.AppCompatTextViewに変更します。

https://stackoverflow.com/a/45208134/332798 を参照してください

34
tmm1

要件

  • 1)サブフォルダー「/ fonts」を持つアセットフォルダー

  • 2)/ fontsフォルダーにカスタムフォント「.ttf」ファイルが必要です。

  • 3)列挙

  • 4)attrs.xmlファイル

  • 5)Javaクラス

  • 6)使い方


1)でアセットフォルダーを作成する

src/main/assets

2)カスタムフォントを追加する

src/main/assets/fonts/

3)列挙

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)attrs.xmlファイル

res/valuesフォルダーにattrs.xmlを作成します

<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)使い方

    <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" />

以下の名前空間を上位の親に追加します。xmlファイルのレイアウトxmlns:app = "http://schemas.Android.com/apk/res-auto"

参照:

"Android Custom TypeFace fontFamily "

ここをクリック

これにより、Androidで任意のフォントを簡単に追加できます。

3
Dhiren

パーティーに少し遅れましたが、FragmentActivitiesでfontFamilyを使用する際に問題が発生しました。これらのアクティビティでは、フォントは正しく表示されません。 AppCompatActivity(FragmentActivityを拡張)からアクティビティを拡張すると、フォントが正しく表示されます。

2
Rik van Velzen

カスタムテキストビューまたはボタンビューのバインドにバターナイフビューインジェクションを使用している場合、カスタムビュークラスのonFinishInflate()メソッドをオーバーライドする必要があります。
例えば:

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

Android support lib以下のapi 26には、これを使用できます。

クラスを作成TypefaceUtil.Javaと以下のコードを追加

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) {
        }
    }
}

...そしてApplication classを拡張するアプリケーションクラスにこれを追加します。

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

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

... Androidこのクラスをmanifest.xmlに追加します

Android:name=".MyApplication"

...そして最後に、この行をスタイルに追加します:

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

しかし、これはサポートライブラリAPI 26以降では機能しません。このため、このバージョンを使用できます

  1. resフォルダーにfontという名前のフォルダーを作成します
  2. このフォルダーにフォントを入れます
  3. xmlファイル(フォントリソースファイル)(myfont.xml)を作成し、次のコードを追加します。

    <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" />
    

...そして、次の行をアプリのスタイルコードに追加します。

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

これがお役に立てば幸いです。

1
Fahimi

フォントが機能しなかった理由を理解しようとして何時間も費やしました。書道ライブラリから移行しようとしていたので、アプリケーションクラスでデフォルトのフォント設定を無効にする必要があります。

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

デフォルトのフォント設定をこれに置き換えます。

<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>
1
Rubin Yoo