Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Create Views with custom fonts like this</p> <p><strong>FontManager.java</strong></p> <pre><code>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&lt;String&gt; families; // different styles for this font. List&lt;FontStyle&gt; styles; } private List&lt;Font&gt; 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&lt;Font&gt;(); 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&lt;String&gt;(); } 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&lt;FontStyle&gt;(); } 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; } } </code></pre> <p><strong>res/values/Fonts.xml</strong></p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;resources&gt; &lt;declare-styleable name="Fonts"&gt; &lt;!-- using android's --&gt; &lt;attr name="android:textStyle" /&gt; &lt;!-- our custom attribute --&gt; &lt;attr name="font" format="string" /&gt; &lt;/declare-styleable&gt; &lt;/resources&gt; </code></pre> <p><strong>res/xml/fonts.xml</strong></p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;familyset&gt; &lt;!-- Arial --&gt; &lt;family&gt; &lt;nameset&gt; &lt;name&gt;Arial&lt;/name&gt; &lt;/nameset&gt; &lt;fileset&gt; &lt;file&gt;fonts/Arial-Regular.ttf&lt;/file&gt; &lt;file&gt;fonts/Arial-Bold.ttf&lt;/file&gt; &lt;file&gt;fonts/Arial-Italic.ttf&lt;/file&gt; &lt;file&gt;fonts/Arial-BoldItalic.ttf&lt;/file&gt; &lt;/fileset&gt; &lt;/family&gt; &lt;/familyset&gt; </code></pre> <p>Add the fonts inside <strong>assets/fonts</strong></p> <pre><code>Arial-Bold.ttf Arial-BoldItalic.ttf Arial-Italic.ttf Arial-Regular.ttf </code></pre> <p>Create your custom view <strong><em>Ex</em></strong>: <strong>FontableTextView.java</strong></p> <pre><code>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)); } } } </code></pre> <p><strong>Initiate FontManager to set custom fonts at the start of the MainActivity</strong></p> <pre><code>FontManager.getInstance().initialize(getApplicationContext(), R.xml.fonts); </code></pre> <p><strong>Use the custom view in Layout XML</strong></p> <pre><code>&lt;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" &gt; &lt;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" /&gt; &lt;/RelativeLayout&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload