カスタムフォントをTextView
に適用しましたが、書体は変更されません。
これが私のコードです:
Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(myTypeface);
誰かが私をこの問題から解放してもらえますか?
Mobiletuts +では、Androidのテキストフォーマットに関する非常に優れたチュートリアルがあります。 クイックヒント:Androidフォントのカスタマイズ
編集:今それを自分でテストしました。これが解決策です。 fontsというサブフォルダーを使用できますが、assets
フォルダーではなくres
フォルダーに入れる必要があります。そう
資産/フォント
また、フォントファイル自体の末尾のフォントの末尾がすべて小文字であることを確認してください。つまり、myFont.TTF
ではなくmyfont.ttf
にする必要があります。このように小文字にする必要があります
このスレッドで説明されている解決策のほとんどを試した後、私は誤ってCalligraphy( https://github.com/chrisjenx/Calligraphy )を見つけました - Christopher Jenkinsによるライブラリ。アプリ。ここで提案されたアプローチと比較した彼のlibの利点は以下のとおりです。
良い答えがすでにあることを私は知っていますが、これは完全に機能する実装です。
これがカスタムテキストビューです。
package com.mycompany.myapp.widget;
/**
* Text view with a custom font.
* <p/>
* In the XML, use something like {@code customAttrs:customFont="roboto-thin"}. The list of fonts
* that are currently supported are defined in the enum {@link CustomFont}. Remember to also add
* {@code xmlns:customAttrs="http://schemas.Android.com/apk/res-auto"} in the header.
*/
public class CustomFontTextView extends TextView {
private static final String sScheme =
"http://schemas.Android.com/apk/res-auto";
private static final String sAttribute = "customFont";
static enum CustomFont {
ROBOTO_THIN("fonts/Roboto-Thin.ttf"),
ROBOTO_LIGHT("fonts/Roboto-Light.ttf");
private final String fileName;
CustomFont(String fileName) {
this.fileName = fileName;
}
static CustomFont fromString(String fontName) {
return CustomFont.valueOf(fontName.toUpperCase(Locale.US));
}
public Typeface asTypeface(Context context) {
return Typeface.createFromAsset(context.getAssets(), fileName);
}
}
public CustomFontTextView(Context context, AttributeSet attrs) {
super(context, attrs);
if (isInEditMode()) {
return;
} else {
final String fontName = attrs.getAttributeValue(sScheme, sAttribute);
if (fontName == null) {
throw new IllegalArgumentException("You must provide \"" + sAttribute + "\" for your text view");
} else {
final Typeface customTypeface = CustomFont.fromString(fontName).asTypeface(context);
setTypeface(customTypeface);
}
}
}
}
これがカスタム属性です。これはあなたのres/attrs.xml
ファイルに行きます:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomFontTextView">
<attr name="customFont" format="string"/>
</declare-styleable>
</resources>
そして、これがあなたがそれを使う方法です。それをラップしてcustomAttr
宣言を示すために相対的なレイアウトを使いますが、それは明らかにあなたがすでに持っているどんなレイアウトでもありえます。
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:customAttrs="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<com.mycompany.myapp.widget.CustomFontTextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="foobar"
customAttrs:customFont="roboto_thin" />
</RelativeLayout>
私は以前にこれを使用しました。私たちの実装の唯一の違いは、私がアセットにサブフォルダを使っていなかったことです。しかし、それが何かを変えるかどうかは定かではありません。
フォントを正しい場所に配置し、フォントファイル自体にエラーがなければ、コードはそのように動作するはずです(RATTLESNAKE)。
ただし、次のようにレイアウトxmlにフォントを定義できれば、はるかに簡単になります。
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity" >
<!-- This text view is styled with the app theme -->
<com.innovattic.font.FontTextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="This uses my font in bold italic style" />
<!-- This text view is styled here and overrides the app theme -->
<com.innovattic.font.FontTextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:flFont="anotherFont"
Android:textStyle="normal"
Android:text="This uses another font in normal style" />
<!-- This text view is styled with a style and overrides the app theme -->
<com.innovattic.font.FontTextView
style="@style/StylishFont"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="This also uses another font in normal style" />
</LinearLayout>
付随するres/values/styles.xml
と共に:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:tools="http://schemas.Android.com/tools">
<!-- Application theme -->
<!-- Use a different parent if you don't want Holo Light -->
<style name="AppTheme" parent="Android:Theme.Holo.Light.DarkActionBar">
<item name="Android:textViewStyle">@style/MyTextViewStyle</item>
</style>
<!-- Style to use for ALL text views (including FontTextView) -->
<!-- Use a different parent if you don't want Holo Light -->
<style name="MyTextViewStyle" parent="@Android:style/Widget.Holo.Light.TextView">
<item name="Android:textAppearance">@style/MyTextAppearance</item>
</style>
<!-- Text appearance to use for ALL text views (including FontTextView) -->
<!-- Use a different parent if you don't want Holo Light -->
<style name="MyTextAppearance" parent="@Android:style/TextAppearance.Holo">
<!-- Alternatively, reference this font with the name "aspergit" -->
<!-- Note that only our own TextView's will use the font attribute -->
<item name="flFont">someFont</item>
<item name="Android:textStyle">bold|italic</item>
</style>
<!-- Alternative style, maybe for some other widget -->
<style name="StylishFont">
<item name="flFont">anotherFont</item>
<item name="Android:textStyle">normal</item>
</style>
</resources>
私は特にこの目的のためにいくつかのツールを作成しました。 GitHubの このプロジェクト を参照するか、これを見てください ブログ記事 これですべてのことを説明できます。
Androidのカスタムフォントの場合は、アセットフォルダ内に「fonts」という名前のフォルダを作成し、そこに目的のfonts.ttfファイルまたは.otfファイルを配置します。
UIBaseFragmentを拡張した場合
Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Arial.ttf");
tv.setTypeface(font);
それ以外の場合はActivityを拡張します。
Typeface font = Typeface.createFromAsset(getContext().getAssets(), "fonts/Arial.ttf");
tv.setTypeface(font);
それをするための最良の方法は、Android Oのプレビューリリースからは、この方法です:
Android studio-2.4以上がある場合にのみ機能します
R.font.dancing_script
、R.font.la_la
、R.font.ba_ba
を生成します。次にフォントファミリーを作成します。
各フォントファイル、スタイル、および太さ属性をフォントタグ要素で囲みます。次のXMLは、フォントリソースXMLにフォント関連の属性を追加する方法を示しています。
TextViewにフォントを追加する:
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:fontFamily="@font/hey_fontfamily"/>
ドキュメントから
すべての手順は正しいです。
PixlUIは https://github.com/neopixl/PixlUI で使用できます。
それらの.jarをインポートしてXMLで使用する
<com.neopixl.pixlui.components.textview.TextView
Android:id="@+id/textView1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/hello_world"
pixlui:typeface="GearedSlab.ttf" />
私はSOについて提示されたすべての解決策に満足していなかったので、私は私に思い付きました。これはタグを使ったちょっとしたトリックに基づいています(つまり、コードにタグを使用することはできません)。ここにフォントパスを置きます。そのため、ビューを定義するときには、次のいずれかを実行できます。
<TextView
Android:id="@+id/textViewHello1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Hello World 1"
Android:tag="fonts/Oswald-Regular.ttf"/>
またはこれ:
<TextView
Android:id="@+id/textViewHello2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Hello World 2"
style="@style/OswaldTextAppearance"/>
<style name="OswaldTextAppearance">
<item name="Android:tag">fonts/Oswald-Regular.ttf</item>
<item name="Android:textColor">#000000</item>
</style>
これで、ビューに明示的にアクセス/設定することができます。
TextView textView = TextViewHelper.setupTextView(this, R.id.textViewHello1).setText("blah");
または単に次のようにしてすべてを設定します。
TextViewHelper.setupTextViews(this, (ViewGroup) findViewById(R.id.parentLayout)); // parentLayout is the root view group (relative layout in my case)
そして、あなたが求めるマジッククラスは何ですか?アクティビティとフラグメントの両方のためのヘルパーメソッドを使って、他のSO投稿から大部分接着されました:
import Android.app.Activity;
import Android.content.Context;
import Android.graphics.Typeface;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.TextView;
import Java.util.HashMap;
import Java.util.Map;
public class TextViewHelper {
private static final Map<String, Typeface> mFontCache = new HashMap<>();
private static Typeface getTypeface(Context context, String fontPath) {
Typeface typeface;
if (mFontCache.containsKey(fontPath)) {
typeface = mFontCache.get(fontPath);
} else {
typeface = Typeface.createFromAsset(context.getAssets(), fontPath);
mFontCache.put(fontPath, typeface);
}
return typeface;
}
public static void setupTextViews(Context context, ViewGroup parent) {
for (int i = parent.getChildCount() - 1; i >= 0; i--) {
final View child = parent.getChildAt(i);
if (child instanceof ViewGroup) {
setupTextViews(context, (ViewGroup) child);
} else {
if (child != null) {
TextViewHelper.setupTextView(context, child);
}
}
}
}
public static void setupTextView(Context context, View view) {
if (view instanceof TextView) {
if (view.getTag() != null) // also inherited from TextView's style
{
TextView textView = (TextView) view;
String fontPath = (String) textView.getTag();
Typeface typeface = getTypeface(context, fontPath);
if (typeface != null) {
textView.setTypeface(typeface);
}
}
}
}
public static TextView setupTextView(View rootView, int id) {
TextView textView = (TextView) rootView.findViewById(id);
setupTextView(rootView.getContext().getApplicationContext(), textView);
return textView;
}
public static TextView setupTextView(Activity activity, int id) {
TextView textView = (TextView) activity.findViewById(id);
setupTextView(activity.getApplicationContext(), textView);
return textView;
}
}
残念ながらこれに対する良い解決策はありません。
私は、カスタムTextViewの使用に関する多くの記事を見ましたが、フォントを実装できるのはテキストビューだけではなく、開発者にとってアクセスできない他のビューに隠されているテキストビューもあります。私も始めるつもりはありませんSpannable。
次のような外部フォントユーティリティを使うことができます。
BUT作成時にアプリケーション内のすべてのビューをループし、このユーティリティでも一部のビューが表示されなくなる(ViewPagerは通常のフォントをレンダリングします)。廃止予定のプロパティを対象とする必要があるためクラッシュします。 Java's Reflectionを使っているので少し遅いです。
これを解決するのは本当にグーグル次第です。私たちはAndroidでより良いフォントサポートを必要としています。あなたがiOSからの解決策を見れば、彼らは文字通りから選択するために組み込まれた何百ものフォントを持っています。カスタムフォントが欲しいですか? TFFを入れるだけで使えます。
今のところ、今はGoogleが提供しているサービスに限られていました。
アプリケーションでカスタムフォントを使用するAndroid 8.0ではdownloadable fonts
で簡単になりました。プロジェクトフォルダのres/font/ folder
に直接フォントを追加することができます。その際、フォントはAndroid Studioで自動的に使用可能になります。
今度はfontFamily
属性をフォントのリストに設定するか、moreをクリックしてあなたの選んだフォントを選択してください。これはTextViewにtools:fontFamily="@font/your_font_file"
行を追加します
これは自動的にいくつかのファイルを生成します。
1.valuesフォルダにfonts_certs.xml
を作成します。
2。Manifestでは次の行を追加します。
<meta-data
Android:name="preloaded_fonts"
Android:resource="@array/preloaded_fonts" />
3。preloaded_fonts.xml
<resources>
<array name="preloaded_fonts" translatable="false">
<item>@font/open_sans_regular</item>
<item>@font/open_sans_semibold</item>
</array>
</resources>
上記のコードを必ずonCreate()after superへの呼び出しとsetContentView()への呼び出しに貼り付けてください。この細部が私をしばらくの間ハングアップさせ続けた。
あなたがネットワークからフォントをロードしたい、または簡単にそれをスタイルしたいならば、あなたは使うことができます:
https://github.com/shellum/fontView
例:
<!--Layout-->
<com.finalhack.fontview.FontView
Android:id="@+id/someFontIcon"
Android:layout_width="80dp"
Android:layout_height="80dp" />
//Java:
fontView.setupFont("http://blah.com/myfont.ttf", true, character, FontView.ImageType.CIRCLE);
fontView.addForegroundColor(Color.RED);
fontView.addBackgroundColor(Color.WHITE);
さて、7年後にはAndroid.support
ライブラリ26 ++を使うことでアプリ全体のtextView
や簡単に望むものを変更することができます。
例えば:
あなたのフォントパッケージapp/src/res/fontを作成し、そこにあなたのフォントを移動してください。
そしてあなたのアプリのテーマではfontFamilyとして追加するだけです。
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
. . . ...
<item name="Android:fontFamily">@font/demo</item>
</style>
textView
でのみ使用する例
<style name="fontTextView" parent="@Android:style/Widget.TextView">
<item name="Android:fontFamily">monospace</item>
</style>
そしてあなたのメインテーマに加えてください:
<item name="Android:textViewStyle">@style/fontTextView</item>
現在それは8.1から4.1 APIジェリービーンに取り組んでいますそしてそれは広い範囲です。
私は同じ問題を抱えていました、TTFは現れませんでした。フォントファイルを変更しましたが、同じコードで動作しています。
あなたはあなたのTextView
に様々なカスタムフォントを設定するためにeasy&simple EasyFonts 第三者ライブラリを使うことができます。このライブラリを使用すれば、フォントをダウンロードしてassets/fontsフォルダに追加することを心配する必要はありません。 Typefaceオブジェクト作成についても。
の代わりに
Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(myTypeface);
単に:
TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(EasyFonts.robotoThin(this));
このライブラリは以下のフォントも提供しています。
アップデートの回答:Android 8.0(APIレベル26)では、Fonts in XMLという新しい機能が導入されました。 Android 4.1(APIレベル16)以降を実行しているデバイスではXMLのフォント機能を使用するだけで、サポートライブラリ26を使用します。
これを参照してください link
古い答え
フォントをカスタマイズする方法は2つあります。
!!! assets/fonts/iran_sans.ttfにある私のカスタムフォント
方法1:リフレクションTypeface.class ||| 最善の方法
クラス内でFontsOverride.setDefaultFont()を呼び出してApplicationを拡張します。このコードは、Toastsフォントであってもすべてのソフトウェアフォントを変更します。
AppController.Java
public class AppController extends Application {
@Override
public void onCreate() {
super.onCreate();
//Initial Font
FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");
}
}
FontsOverride.Java
public class FontsOverride {
public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) {
final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName);
replaceFont(staticTypefaceFieldName, regular);
}
private 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();
}
}
}
方法2:setTypefaceを使用する
特別な表示のためには単にフォントを変更するためにsetTypeface()を呼び出してください。
CTextView.Java
public class CTextView extends TextView {
public CTextView(Context context) {
super(context);
init(context,null);
}
public CTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context,attrs);
}
@RequiresApi(api = Build.VERSION_CODES.Lollipop)
public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context,attrs);
}
public void init(Context context, @Nullable AttributeSet attrs) {
if (isInEditMode())
return;
// use setTypeface for change font this view
setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));
}
}
FontUtils.Java
public class FontUtils {
private static Hashtable<String, Typeface> fontCache = new Hashtable<>();
public static Typeface getTypeface(String fontName) {
Typeface tf = fontCache.get(fontName);
if (tf == null) {
try {
tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
} catch (Exception e) {
e.printStackTrace();
return null;
}
fontCache.put(fontName, tf);
}
return tf;
}
}
TextView txt = (TextView) findViewById(R.id.txt_act_spalsh_welcome); Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Aramis Italic.ttf"); txt.setTypeface(font);
フォントの名前は正しくなければなりません
Androidが最も簡単にサポートされるようになりました。
Xmlでカスタムフォントを使う:
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:fontFamily="@font/[your font resource]"/>
詳細を見る:
https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html
はい、ダウンロード可能なフォントはとても簡単です。Dipali sが言っています。
これがあなたのやり方です….
TextView
を配置してください。fontFamily
ドロップダウンを選択します。表示されていない場合は、の下でキャレットを探してください(>をクリックし、それをクリックしてtextAppearance
を展開します)。font-family
ドロップダウンを展開します。more fonts
が表示されるまで一番下までスクロールしますGoogle Fonts
から検索できるダイアログボックスが開きます。Add font to project
というラジオボタンを選択します。ボーナス:あなたが選択したフォントであなたのアプリケーションでテキストですべてをスタイルすることを望むならば、ちょうどあなたの<item name="Android:fontfamily">@font/fontnamehere</item>
にstyles.xml
を加えてください
API 26以降でこれを行う正しい方法は、こちらの公式文書に記載されています。
https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html
これには、ttfファイルをres/fontフォルダに配置し、フォントファミリファイルを作成することが含まれます。