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'
フォントリソースディレクトリ:
デザインプレビュー:ここでフォントが機能しています
Androidデバイスのスクリーンショット:ここでフォントは機能していません
TextViewをAndroid.support.v7.widget.AppCompatTextViewに変更します。
要件
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で任意のフォントを簡単に追加できます。
パーティーに少し遅れましたが、FragmentActivitiesでfontFamilyを使用する際に問題が発生しました。これらのアクティビティでは、フォントは正しく表示されません。 AppCompatActivity(FragmentActivityを拡張)からアクティビティを拡張すると、フォントが正しく表示されます。
カスタムテキストビューまたはボタンビューのバインドにバターナイフビューインジェクションを使用している場合、カスタムビュークラスのonFinishInflate()
メソッドをオーバーライドする必要があります。
例えば:
@Override
protected void onFinishInflate() {
super.onFinishInflate();
Typeface font_type = Typeface.createFromAsset(getContext().getAssets(), "fonts/" + fontStyle);
this.setTypeface(font_type);
}
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以降では機能しません。このため、このバージョンを使用できます
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>
これがお役に立てば幸いです。
フォントが機能しなかった理由を理解しようとして何時間も費やしました。書道ライブラリから移行しようとしていたので、アプリケーションクラスでデフォルトのフォント設定を無効にする必要があります。
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>