web-dev-qa-db-ja.com

AndroidのXMLファイルからassetsフォルダーの下のフォントにアクセスする

アプリケーション全体でフォントを変更し、そのためのスタイルファイルを作成しようとしています。このファイル(下記)では、AndroidのTextAppearanceスタイルの書体値を変更したいだけです。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="NightRiderFont" parent="@Android:style/TextAppearance">
        <item name="Android:typeface"> /***help need here***/ </item>
    </style>
</resources>

ただし、フォントは「assets/fonts /」にあります。このフォントにアクセスするにはどうすればいいですか?そのスタイルをテーマとして使用して、すべてのTextViewをプログラムで手動で変更する必要がなくなります。

要約:XMLで「アセットフォルダーのファイル」にアクセスするにはどうすればよいですか?

31
erkangur

私の研究では、外部フォントをxmlファイルに追加する方法はありません。 xmlでは3つのデフォルトフォントのみが使用可能です

ただし、このコードを使用してJavaで使用できます。

Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/verdana.ttf");  
textfield.setTypeface(tf,Typeface.BOLD);

更新:

TextViewを拡張するカスタムクラスを作成し、それをxmlファイルで使用することにより、これを行う方法を見つけました。

public class TextViewWithFont extends TextView {
    private int defaultDimension = 0;
    private int TYPE_BOLD = 1;
    private int TYPE_ITALIC = 2;
    private int FONT_ARIAL = 1;
    private int FONT_OPEN_SANS = 2;
    private int fontType;
    private int fontName;

    public TextViewWithFont(Context context) {
        super(context);
        init(null, 0);
    }
    public TextViewWithFont(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, 0);
    }
    public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs, defStyle);
    }
    private void init(AttributeSet attrs, int defStyle) {
        // Load attributes
        final TypedArray a = getContext().obtainStyledAttributes(
                attrs, R.styleable.font, defStyle, 0);
        fontName = a.getInt(R.styleable.font_name, defaultDimension);
        fontType = a.getInt(R.styleable.font_type, defaultDimension);
        a.recycle();
        MyApplication application = (MyApplication ) getContext().getApplicationContext();
        if (fontName == FONT_ARIAL) {
            setFontType(application .getArialFont());
        } else if (fontName == FONT_OPEN_SANS) {
            setFontType(application .getOpenSans());
        }
    }
    private void setFontType(Typeface font) {
        if (fontType == TYPE_BOLD) {
            setTypeface(font, Typeface.BOLD);
        } else if (fontType == TYPE_ITALIC) {
            setTypeface(font, Typeface.ITALIC);
        } else {
            setTypeface(font);
        }
    }
}

およびxml

<com.example.customwidgets.TextViewWithFont
        font:name="Arial"
        font:type="bold"
        Android:layout_width="wrap_content"
        Android:text="Hello world "
        Android:padding="5dp"
        Android:layout_height="wrap_content"/>

xmlのルートにスキーマを追加することを忘れないでください

xmlns:font="http://schemas.Android.com/apk/res-auto"

そして、attrs.xmlファイルはvaluesディレクトリ内にあり、カスタム属性を保持しています。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="font">
        <attr name="type">
        <enum name="bold" value="1"/>
            <enum name="italic" value="2"/>
        </attr>
        <attr name="name">
            <enum name="Arial" value="1"/>
            <enum name="OpenSans" value="2"/>
        </attr>
    </declare-styleable>
</resources>

更新:

このカスタムビューがリストビューで使用されると、ビューが読み込まれるたびにフォントオブジェクトが作成されるため、パフォーマンスの問題がいくつか見つかりました。私が見つけた解決策は、アプリケーションクラスでフォントを初期化し、そのフォントオブジェクトを参照することです

MyApplication application = (MyApplication) getContext().getApplicationContext();

アプリケーションクラスは次のようになります

public class MyApplication extends Application {

    private Typeface arialFont, openSans;

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

        arialFont = Typeface.createFromAsset(getAssets(), QRUtils.FONT_ARIAL);
        openSans = Typeface.createFromAsset(getAssets(), QRUtils.FONT_OPEN_SANS);
    }

    public Typeface getArialFont() {
        return arialFont;
    }

    public Typeface getOpenSans() {
        return openSans;
    }
}
74
droid kid

編集2:

最後に、xmlでフォントがサポートされます(サポートライブラリを介した下位互換性もあります): https://developer.Android.com/preview/features/fonts-in-xml.html


編集:

現在、 Calligraphy ライブラリを使用しています。これは、カスタムフォントの最も簡単な方法です。

あなたにできること:

  • TextViewのカスタムフォント
  • TextAppearanceのカスタムフォント
  • スタイルのカスタムフォント
  • テーマのカスタムフォント
  • テキストの一部にのみフォントを適用するFontSpannable

これを行う別の方法を見つけました。

これを使用して独自のTextViewを作成する必要があります tutorial

それほど難しくはありません。この後、あなたは自分のフォントでTextViewを使うことができます。

まだこれを見ている人がいるかどうかはわかりませんが、役立つと思いました。

7

単一のフォントを使用している場合、この関数を使用します。

public static void applyFont(final Context context, final View root, final String fontName) {
        try {
            if (root instanceof ViewGroup) {
                ViewGroup viewGroup = (ViewGroup) root;
                for (int i = 0; i < viewGroup.getChildCount(); i++)
                    applyFont(context, viewGroup.getChildAt(i), fontName);
            } else if (root instanceof TextView)
                ((TextView) root).setTypeface(Typeface.createFromAsset(context.getAssets(), fontName));
        } catch (Exception e) {
            Log.e("ProjectName", String.format("Error occured when trying to apply %s font for %s view", fontName, root));
            e.printStackTrace();
        }
    }
5
Ashwin S Ashok

Sooryaは正しいですが、多くのtextViewに同じフォントを配置する必要がある場合は、必要なTypefaceを返す静的メソッド内にそのコードを配置することをお勧めします。コードの行が減ります。または、Applicationを拡張するクラスを作成し、Typefaceを返すGETメソッドを作成することもできます。そのメソッドは、アプリケーション内の任意のアクティビティから到達可能です(静的変数または静的メソッドを使用する必要はありません)。

2
gian1200

fount changeは、Androidの非常に基本的な機能です。これは、ほとんどすべてのアプリケーションに必要です。リンク FountChanger.class

1
John smith

私はドロイドキッドの答えを取り、XMLに直接フォントファイル名を入力するだけで、どのフォントでも動作するようにしました:

layout.xml

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:custom="http://schemas.Android.com/apk/res-auto" >

    <!-- where font file is at "assets/fonts/arial.ttf" -->
    <com.odbol.widgets.TextViewWithFont
        ...
        custom:fontFilePath="fonts/arial.ttf" />

</RelativeLayout>

Fonts.Java

public class Fonts {

    // use Weak so fonts are freed from memory when you stop using them
    private final static Map<String, Typeface> fonts = new WeakHashMap<>(5);

    /***
     * Returns a font at the given path within the assets directory.
     *
     * Caches fonts to save resources.
     *
     * @param context
     * @param fontPath Path to a font file relative to the assets directory, e.g. "fonts/Arial.ttf"
     * @return
     */
    public synchronized static Typeface getFont(Context context, String fontPath) {
        Typeface font = fonts.get(fontPath);

        if (font == null) {
            font = Typeface.createFromAsset(context.getAssets(), fontPath);
            fonts.put(fontPath, font);
        }

        return font;
    }
}

values/attrs.xml

<resources>

    <declare-styleable name="TextViewWithFont">
        <!-- a path to a font, relative to the assets directory -->
        <attr name="fontFilePath" format="string" />

        <attr name="type">
            <enum name="bold" value="1"/>
            <enum name="italic" value="2"/>
        </attr>
    </declare-styleable>
</resources>

TextViewWithFont.Java

public class TextViewWithFont extends TextView {
    private int defaultDimension = 0;
    private int TYPE_BOLD = 1;
    private int TYPE_ITALIC = 2;
    private int fontType;
    private int fontName;

    public TextViewWithFont(Context context) {
        super(context);
        init(null, 0);
    }
    public TextViewWithFont(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, 0);
    }
    public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs, defStyle);
    }
    private void init(AttributeSet attrs, int defStyle) {
        // Load attributes
        final TypedArray a = getContext().obtainStyledAttributes(
                attrs, R.styleable.TextViewWithFont, defStyle, 0);
        String fontPath = a.getString(R.styleable.TextViewWithFont_fontFilePath);
        fontType = a.getInt(R.styleable.TextViewWithFont_type, defaultDimension);
        a.recycle();

        if (fontPath != null) {
            setFontType(Fonts.getFont(getContext(), fontPath));
        }
    }
    private void setFontType(Typeface font) {
        if (fontType == TYPE_BOLD) {
            setTypeface(font, Typeface.BOLD);
        } else if (fontType == TYPE_ITALIC) {
            setTypeface(font, Typeface.ITALIC);
        } else {
            setTypeface(font);
        }
    }
}
1
phreakhead

あなたはちょうどパブリックコールを行い、このようにメソッドを添付しました

public class TextViewFontType {

public Typeface typeface;

public void fontTextView(final TextView textView, final String fonttype) {
    typeface = Typeface.createFromAsset(textView.getContext().getAssets(), fonttype);
    textView.setTypeface(typeface);
}

whereメソッドTextViewがfont-familyを設定するように使用してください。

public class FontList {

    public static final String gothicbNormal="fonts/gothicb.ttf";
    public static final String gothicbBold="fonts/gothicb.ttf";
}

2つのパラメーターを渡すと、どこでもメソッドを呼び出した後にFontListを作成しました。

1
MalhotraUrmil

アセットフォルダーの代わりに、.ttfファイルをフォントフォルダーに配置できます。 Android 4.1(APIレベル16)以降を実行しているデバイスでXML機能のフォントサポートを使用するには、サポートライブラリ26+を使用します。resフォルダを右クリックし、新規-> Androidリソースディレクトリ->フォントの選択-> OK。「myfont.ttf」ファイルを新しく作成したフォントフォルダーに配置します。

Res/values/styles.xmlに追加し、

<style name="customfontstyle" parent="@Android:style/TextAppearance.Small">
<item name="Android:fontFamily">@font/myfont</item>
</style>

レイアウトファイルにAndroid:textAppearance = "@ style/customfontstyle"を追加し、

<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textAppearance="@style/customfontstyle"/>

参照: https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml

0
Thomas V J

//コードでフォントファイルにアクセスし、

Typeface type = Typeface.createFromAsset(getResources().getAssets(),"fonts/arial.ttf");
textView.setTypeface(type);//assign typeface to textview

//資産フォルダ-> fonts(foldername)-> arial.ttf(font file name)

0
vbijoor

あなたに完全に使用することを望む:-

TextView text = (TextView) findViewById(R.id.custom_font);
Typeface font = Typeface.createFromAsset(getAssets(), "yourfont.ttf");
text.setTypeface(font);
0
duggu

このライブラリを使用できます: https://github.com/chrisjenx/Calligraphy

レイアウトで使用するフォントを追加するだけです。このような:

<TextView
 fontPath="fonts/verdana.ttf"
 Android:layout_width="wrap_content"
 Android:layout_height="wrap_content"/>