在xml文件android中定义资产文件夹中的字体

时间:2014-11-01 13:52:29

标签: android xml fonts android-assets

我在资产文件夹中创建了名为fonts的文件夹,并在其中放入了一个.ttf文件。并将fontfamily分配给我的文本

txtName.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/segoeui.ttf"));

但是我想在xml文件中分配这个字体。可能是这样的。

<TextView
        android:id="@+id/txtName"
        style="@style/My_Name"
        android:fontFamily="@android:asset/fonts/segoeui"
         />

5 个答案:

答案 0 :(得分:1)

在您的应用中加入 ttf 文件会增加您的应用尺寸。

可下载字体是使用其他字体的最佳解决方案。 使用以下参考:

<强>文件: https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts.html

<强>样品: https://github.com/googlesamples/android-DownloadableFonts

仍然要包含fontFile,然后使用以下答案: https://stackoverflow.com/a/27588966/8240915

答案 1 :(得分:0)

只需使用此代码即可。只需添加segoeui.ttf文件名即可。

android:fontFamily="fonts/segoeui.ttf"

答案 2 :(得分:0)

您可以创建自定义FontTextView: - 在 src包中添加此自定义FontTextView:

package com.example.android.ui;

import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

import java.util.HashMap;
import java.util.Map;

public class FontTextView extends TextView {

    private static Map<String, Typeface> mTypefaces;

    public FontTextView(final Context context) {
        this(context, null);
    }

    public FontTextView(final Context context, final AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public FontTextView(final Context context, final AttributeSet attrs, final int defStyle) {
        super(context, attrs, defStyle);
        if (mTypefaces == null) {
            mTypefaces = new HashMap<String, Typeface>();
        }

        final TypedArray array = context.obtainStyledAttributes(attrs, styleable.FontTextView);
        if (array != null) {
            final String typefaceAssetPath = array.getString(
                    R.styleable.FontTextView_customTypeface);

            if (typefaceAssetPath != null) {
                Typeface typeface = null;

                if (mTypefaces.containsKey(typefaceAssetPath)) {
                    typeface = mTypefaces.get(typefaceAssetPath);
                } else {
                    AssetManager assets = context.getAssets();
                    typeface = Typeface.createFromAsset(assets, typefaceAssetPath);
                    mTypefaces.put(typefaceAssetPath, typeface);
                }

                setTypeface(typeface);
            }
            array.recycle();
        }
    }

}

- 在res / values中添加 tt_attrs.xml

<resources>

    <declare-styleable name="FontTextView">
        <attr name="customTypeface" format="string" />
    </declare-styleable>

</resources>

- 在你想要的布局中添加字体textview:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:geekui="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.example.android.ui.FontTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        android:textSize="30sp"
        geekui:customTypeface="fonts/segoeui.ttf" />

    <com.entreprise.android.ui.FontTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="@string/app_name"
        geekui:customTypeface="fonts/Times New Roman.ttf" />

    <com.entreprise.android.ui.FontTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="@string/app_name"
        geekui:customTypeface="fonts/arial unicode ms.ttf" />

</LinearLayout>

所有这些源代码都来自https://github.com/ragunathjawahar/android-typeface-textview

答案 3 :(得分:0)

你可以这样做。 在您的Application类中:

Typeface fontHelvetica = Typeface.createFromAsset(this.getResources().getAssets(), "font/helvetica_font.ttf");
injectTypeface("helvetica", fontHelvetica);

private boolean injectTypeface(String fontFamily, Typeface typeface) {
        try {
            Field field = Typeface.class.getDeclaredField("sSystemFontMap");
            field.setAccessible(true);
            Object fieldValue = field.get(null);
            Map<String, Typeface> map = (Map<String, Typeface>) fieldValue;
            map.put(fontFamily, typeface);
            return true;
        } catch (Exception e) {
            Log.e("Font-Injection", "Failed to inject typeface.", e);
        }
        return false;
    }

之后,您可以按照问题中的提及使用XML。

答案 4 :(得分:-1)

你可以通过制作像这样扩展TextView的CustomTextView来实现这一点,如下所示

public class MyTextView extends TextView {

public MyTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

public MyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MyTextView(Context context) {
    super(context);
    init();
}

private void init() {
    Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
                                           "your_font.ttf");
    setTypeface(tf);
}

}

但请记住,旧的Android版本中存在严重的记忆概念。请参阅此问题

https://code.google.com/p/android/issues/detail?id=9904