Android自定义字体-适用于系统组件,例如Actionbar,Toast,Dialogs

我正在将应用程序翻译成不支持的语言-设备上缺少字体.
因此,我为应用程序添加了字体,并更改了所有TextView,EditText,Button的字体.
另外,我还能够更改WebView中的字体.
但是现在我需要为所有系统组件更改字体:

> ActionBar:

>标题下拉
>菜单
> ShareActionProvider
>动作项
> ActionItems溢出

>对话
>吐司
>设置屏幕

有没有办法更改此组件的字体.
可能所有人中都有一些TextView-只是知道他们的ID以找到他们.

请不要发布有关在TextView上更改字体的答案!

解决方法:

使用这样的自定义字体创建视图

FontManager.java

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.content.Context;
import android.content.res.XmlResourceParser;
import android.graphics.Typeface;
import android.view.InflateException;

public class FontManager
{
    //Making FontManager a singleton class
    private static class InstanceHolder
    {
        private static final FontManager INSTANCE = new FontManager();
    }

    public static FontManager getInstance()
    {
        return FontManager.InstanceHolder.INSTANCE;
    }

    private FontManager()
    {
    }

    // Different tags used in XML file.
    private static final String TAG_FAMILY = "family";
    private static final String TAG_NAMESET = "nameset";
    private static final String TAG_NAME = "name";
    private static final String TAG_FILESET = "fileset";
    private static final String TAG_FILE = "file";

    // Different styles supported.
    private static final String STYLE_BOLD = "-Bold.ttf";
    private static final String STYLE_ITALIC = "-Italic.ttf";
    private static final String STYLE_BOLDITALIC = "-BoldItalic.ttf";

    private class FontStyle
    {
        int style;
        Typeface font;
    }

    private class Font
    {
        // different font-family names that this Font will respond to.
        List<String> families;

        // different styles for this font.
        List<FontStyle> styles;
    }

    private List<Font> mFonts;

    //private boolean isFamilySet = false;
    private boolean isName = false;
    private boolean isFile = false;

    // Parse the resId and initialize the parser.
    public void initialize(Context context, int resId)
    {
        XmlResourceParser parser = null;
        try
        {
            parser = context.getResources().getXml(resId);
            mFonts = new ArrayList<Font>();

            String tag;
            int eventType = parser.getEventType();

            Font font = null;

            do
            {
                tag = parser.getName();

                switch ( eventType )
                {
                    case XmlPullParser.START_TAG:
                        if ( tag.equals(TAG_FAMILY) )
                        {
                            // one of the font-families.
                            font = new Font();
                        }
                        else if ( tag.equals(TAG_NAMESET) )
                        {
                            // a list of font-family names supported.
                            font.families = new ArrayList<String>();
                        }
                        else if ( tag.equals(TAG_NAME) )
                        {
                            isName = true;
                        }
                        else if ( tag.equals(TAG_FILESET) )
                        {
                            // a list of files specifying the different styles.
                            font.styles = new ArrayList<FontStyle>();
                        }
                        else if ( tag.equals(TAG_FILE) )
                        {
                            isFile = true;
                        }
                        break;

                    case XmlPullParser.END_TAG:
                        if ( tag.equals(TAG_FAMILY) )
                        {
                            // add it to the list.
                            if ( font != null )
                            {
                                mFonts.add(font);
                                font = null;
                            }
                        }
                        else if ( tag.equals(TAG_NAME) )
                        {
                            isName = false;
                        }
                        else if ( tag.equals(TAG_FILE) )
                        {
                            isFile = false;
                        }
                        break;

                    case XmlPullParser.TEXT:
                        String text = parser.getText();
                        if ( isName )
                        {
                            // value is a name, add it to list of family-names.
                            if ( font.families != null )
                                font.families.add(text);
                        }
                        else if ( isFile )
                        {
                            // value is a file, add it to the proper kind.
                            FontStyle fontStyle = new FontStyle();
                            fontStyle.font = Typeface.createFromAsset(context.getAssets(), text);

                            if ( text.endsWith(STYLE_BOLD) )
                                fontStyle.style = Typeface.BOLD;
                            else if ( text.endsWith(STYLE_ITALIC) )
                                fontStyle.style = Typeface.ITALIC;
                            else if ( text.endsWith(STYLE_BOLDITALIC) )
                                fontStyle.style = Typeface.BOLD_ITALIC;
                            else
                                fontStyle.style = Typeface.NORMAL;

                            font.styles.add(fontStyle);
                        }
                }

                eventType = parser.next();

            }
            while ( eventType != XmlPullParser.END_DOCUMENT );

        }
        catch ( XmlPullParserException e )
        {
            throw new InflateException("Error inflating font XML", e);
        }
        catch ( IOException e )
        {
            throw new InflateException("Error inflating font XML", e);
        }
        finally
        {
            if ( parser != null )
                parser.close();
        }
    }

    public Typeface get(String family, int style)
    {
        for ( Font font : mFonts )
        {
            for ( String familyName : font.families )
            {
                if ( familyName.equals(family) )
                {
                    // if no style in specified, return normal style.
                    if ( style == -1 )
                        style = Typeface.NORMAL;

                    for ( FontStyle fontStyle : font.styles )
                    {
                        if ( fontStyle.style == style )
                            return fontStyle.font;
                    }
                }
            }
        }

        return null;
    }
}

RES /值/ Fonts.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="Fonts">
        <!-- using android's -->
        <attr name="android:textStyle" />
        <!-- our custom attribute -->
        <attr name="font" format="string" />
    </declare-styleable>
</resources>

RES / XML / fonts.xml

<?xml version="1.0" encoding="utf-8"?>
<familyset>

    <!-- Arial -->
    <family>
        <nameset>
            <name>Arial</name>
        </nameset>

        <fileset>
            <file>fonts/Arial-Regular.ttf</file>
            <file>fonts/Arial-Bold.ttf</file>
            <file>fonts/Arial-Italic.ttf</file>
            <file>fonts/Arial-BoldItalic.ttf</file>
        </fileset>
    </family>

</familyset>

在素材资源/字体中添加字体

Arial-Bold.ttf
Arial-BoldItalic.ttf
Arial-Italic.ttf
Arial-Regular.ttf

创建您的自定义视图,例如:FontableTextView.java

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

public class FontableTextView extends TextView
{
    private static final String TAG = "FontableTextView";

    public FontableTextView(Context context)
    {
        super(context);
    }

    public FontableTextView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public FontableTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    /* 
     * @see android.widget.CompoundButton#onDraw(android.graphics.Canvas)
     */
    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs)
    {
        // Fonts work as a combination of particular family and the style. 
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.Fonts);
        String family = a.getString(R.styleable.Fonts_font);
        int style = a.getInt(R.styleable.Fonts_android_textStyle, -1);
        a.recycle();
        // Set the typeface based on the family and the style combination.
        if ( family != null )
        {
            setTypeface(FontManager.getInstance().get(family, style));
        }
    }
}

在MainActivity开始时启动FontManager以设置自定义字体

FontManager.getInstance().initialize(getApplicationContext(), R.xml.fonts);

在布局XML中使用自定义视图

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <com.package.FontableTextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dip"
        android:text="FontableTextView"
        android:textStyle="bold"
        custom:font="Arial" />
</RelativeLayout>
上一篇:实现自定义Silverlight版本检测和自定义升级Silverlight运行时方法


下一篇:Xamarin.Android-android:fontFamily不起作用