从Android中的XML文件访问assets文件夹下的字体

时间:2011-07-19 11:52:13

标签: android android-assets android-gui android-fonts

我正在尝试进行应用程序范围的字体更改并创建样式文件来执行此操作。在这个文件(下面)我只想改变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中访问“资产文件夹中的文件”?

14 个答案:

答案 0 :(得分:73)

在我的研究中,无法将外部字体添加到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>

<强>更新

  

在使用此自定义视图时发现了一些性能问题   listview,那是因为每次都在创建字体Object   视图已加载。我发现的解决方案是在Application中初始化字体   通过

分类并引用该字体对象
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;
    }
}

答案 1 :(得分:7)

编辑2:

最后xml支持字体(也通过支持库向后兼容):https://developer.android.com/preview/features/fonts-in-xml.html


修改

我现在使用Calligraphy库。这是自定义字体最简单的方法。

你能做什么:

  • TextView
  • 中的自定义字体
  • TextAppearance中的自定义字体
  • 样式中的自定义字体
  • 主题中的自定义字体
  • FontSpannable仅将字体应用于文本的一部分

我找到了另一种方法。

您必须使用此tutorial

制作自己的TextView

这并不困难,在此之后你可以将TextView与你自己的字体一起使用。

我不知道是否还有人看过这个,但我认为这可能有所帮助。

答案 2 :(得分:5)

如果您使用单一字体,请使用此功能。

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();
        }
    }

答案 3 :(得分:2)

Soorya是对的,但是如果你必须在许多textView上放置相同的字体,我建议你把那些代码放在一个返回所需字体的静态方法中。它会减少代码中的行数。或者甚至更好地创建一个扩展Application的类,并创建一个返回Typeface的GET方法。该方法可以从应用程序内的任何Activity访问(无需使用静态变量或静态方法)。

答案 4 :(得分:1)

fount更改是android中非常基本的功能,这对每个应用程序来说都是最需要的。所以每个人只想在应用程序中更改一次,这会减少我们的开发时间,所以我建议你看看这个链接 FountChanger.class

答案 5 :(得分:1)

你刚刚进行公共电话和附加方法

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

您是否使用TextView设置font-family的任何方法。

public class FontList {

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

在你使用pass two参数调用方法之后使得FontList calss。

答案 6 :(得分:1)

我接受了droid kid的回答并使用任何字体工作,只需直接在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;
    }
}

<强>值/ 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);
        }
    }
}

答案 7 :(得分:1)

借助此功能,无需编程即可设置自定义字体。

https://stackoverflow.com/a/27588966/4331353

答案 8 :(得分:0)

希望充分利用你: -

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

答案 9 :(得分:0)

您可以使用此库:https://github.com/chrisjenx/Calligraphy

您只需在布局中添加要使用的字体。 像这样:

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

答案 10 :(得分:0)

您可以将.ttf文件放置在fonts文件夹中,而不是资产文件夹中。 要在运行Android 4.1(API级别16)及更高版本的设备上使用XML功能中的字体支持,请使用支持库26+。 右键单击res文件夹,新建-> Android资源目录->选择字体->确定。 将您的“ 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

答案 11 :(得分:0)

//访问代码中的字体文件,

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

//在资产文件夹中->字体(文件夹名)-> arial.ttf(字体文件名)

答案 12 :(得分:-1)

1.Fisrt我们可以添加资产文件夹&gt;在你的应用程序中你的字体styles.ttfs然后
2.编写字符串中的字体访问代码,如:

<string name="fontregular">OpenSans-Light.ttf</string>
<string name="fontmedium">OpenSans-Regular.ttf</string>

3.访问一些布局xml文件textview代码,如下所示:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fontFamily="@string/fontregular"
    android:textColor="@color/normalfont"
    android:textSize="@dimen/textregular"/>

4.添加字体大小的尺寸:

<dimen name="textregular">14sp</dimen>
<dimen name="textheader">16sp</dimen>
<dimen name="smalltext">12sp</dimen>
<dimen name="littletext">10sp</dimen>
<dimen name="hightfont">18sp</dimen>

5.添加颜色的字体颜色:

<color name="normalfont">#666</color>
<color name="headerfont">#333</color>
<color name="aquablue">#4da8e3</color>
<color name="orange">#e96125</color>

6.然后应用更改,更改孔应用程序很容易。 快乐的编码保持微笑..

答案 13 :(得分:-2)

您可以从assets文件夹访问您的字体文件到xml文件。

机器人:fontFamily中= “字体/ roboto_regular.ttf”

fonts是assets文件夹中的子文件夹。