Android应用和ActionBar中的自定义字体

时间:2014-06-28 14:39:42

标签: java android fonts

我整个下午一直在我的Android应用程序中实现自定义字体。首先,我的导航抽屉里有自定义字体的麻烦。这似乎不起作用。所以我决定尝试Actionbar标题,但我遇到了同样的问题。

我找到了这个网站http://www.tristanwaddington.com/2013/03/styling-the-android-action-bar-with-a-custom-font/,并决定尝试一下。

我使用以下代码创建了一个自定义java文件:

package vimen.vimenlogin;

import android.content.Context;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.text.style.MetricAffectingSpan;
import android.util.LruCache;

public class TypefaceSpan extends MetricAffectingSpan {
    /** An <code>LruCache</code> for previously loaded typefaces. */
    private static LruCache<String, Typeface> sTypefaceCache =
    new LruCache<String, Typeface>(12);

    private Typeface mTypeface;

    /**
     * Load the {@link Typeface} and apply to a {@link}.
     */
    public TypefaceSpan(Context context, String typefaceName) {
        mTypeface = sTypefaceCache.get(typefaceName);

        if (mTypeface == null) {
            mTypeface = Typeface.createFromAsset(context.getApplicationContext()
                .getAssets(), String.format("fonts/%s", typefaceName));

            // Cache the loaded Typeface
            sTypefaceCache.put(typefaceName, mTypeface);
        }
    }

    @Override
    public void updateMeasureState(TextPaint p) {
        p.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }
}

除此之外,我把方法放在我的main.java文件中:

public void restoreActionBar()
{
    actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setDisplayShowTitleEnabled(true);

    SpannableString s = new SpannableString("testing");
    s.setSpan(new TypefaceSpan(this, "fonts/Raleway-Bold.ttf"), 0, s.length(),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    // Update the action bar title with the TypefaceSpan instance
    actionBar.setTitle(s);
    //actionBar.setTitle(mTitle);
}

但是,我收到此错误Caused by: java.lang.RuntimeException: native typeface cannot be made以及崩溃的应用程序。

1 个答案:

答案 0 :(得分:3)

TypefaceSpan不采用字体路径。它仅适用于内置字体系列。无论您使用的是TypefaceSpan还是内置的TypefaceSpan,都无法从代码片段中看出来。

(专业提示:使用与TypefaceSpan不同的班级名称)

错误消息通常意味着Android无法找到字体文件或由于某种原因无法解释它。鉴于您的代码,您的字体文件需要是:

assets/fonts/fonts/Raleway-Bold.ttf

在您的项目中,因为您fonts/TypefaceSpan使用了TypefaceSpan。如果没有字体文件,请移动它或修改代码以引用其实际位置。