How to set custom typeface to items in NavigationView? How to set custom typeface to items in NavigationView? android android

How to set custom typeface to items in NavigationView?


just add following class file to your project.

import android.graphics.Paint;import android.graphics.Typeface;import android.text.TextPaint;import android.text.style.TypefaceSpan;public class CustomTypefaceSpan extends TypefaceSpan {    private final Typeface newType;    public CustomTypefaceSpan(String family, Typeface type) {        super(family);        newType = type;    }    @Override    public void updateDrawState(TextPaint ds) {        applyCustomTypeFace(ds, newType);    }    @Override    public void updateMeasureState(TextPaint paint) {        applyCustomTypeFace(paint, newType);    }    private static void applyCustomTypeFace(Paint paint, Typeface tf) {        int oldStyle;        Typeface old = paint.getTypeface();        if (old == null) {            oldStyle = 0;        } else {            oldStyle = old.getStyle();        }        int fake = oldStyle & ~tf.getStyle();        if ((fake & Typeface.BOLD) != 0) {            paint.setFakeBoldText(true);        }        if ((fake & Typeface.ITALIC) != 0) {            paint.setTextSkewX(-0.25f);        }        paint.setTypeface(tf);    }}

then create following method to your activity

private void applyFontToMenuItem(MenuItem mi) {        Typeface font = Typeface.createFromAsset(getAssets(), "ds_digi_b.TTF");        SpannableString mNewTitle = new SpannableString(mi.getTitle());        mNewTitle.setSpan(new CustomTypefaceSpan("" , font), 0 , mNewTitle.length(),  Spannable.SPAN_INCLUSIVE_INCLUSIVE);        mi.setTitle(mNewTitle);}

and call it from activity.

navView = (NavigationView) findViewById(R.id.navView);        Menu m = navView.getMenu();        for (int i=0;i<m.size();i++) {            MenuItem mi = m.getItem(i);            //for aapplying a font to subMenu ...            SubMenu subMenu = mi.getSubMenu();            if (subMenu!=null && subMenu.size() >0 ) {                for (int j=0; j <subMenu.size();j++) {                    MenuItem subMenuItem = subMenu.getItem(j);                    applyFontToMenuItem(subMenuItem);                }            }            //the method we have create in activity            applyFontToMenuItem(mi);        }

and here is my output

enter image description here


this one working for me

<android.support.design.widget.NavigationView       android:id="@+id/navigation_view"       android:layout_width="wrap_content"       android:layout_height="match_parent"       android:layout_gravity="start"       android:background="#4A4444"       android:clipToPadding="false"       android:paddingBottom="50dp"       app:itemIconTint="@color/white"       app:menu="@menu/drawer_home"       app1:itemTextAppearance="@style/NavigationDrawerStyle" ></android.support.design.widget.NavigationView>

res->values->styles

 <style name="NavigationDrawerStyle">    <item name="android:textSize">18sp</item>    <item name="android:typeface">monospace</item></style>

//to Set Custom Typeface MainApplication.java

public class MainApplication extends Application {    @Override    public void onCreate() {        super.onCreate();//set Custom Typeface        FontsOverride.setDefaultFont(this, "MONOSPACE", "OpenSans-Semibold.ttf");    }}

// FontsOverride.java

public final class FontsOverride {     public static void setDefaultFont(Context context,                String staticTypefaceFieldName, String fontAssetName) {            final Typeface regular = Typeface.createFromAsset(context.getAssets(),                    fontAssetName);            replaceFont(staticTypefaceFieldName, regular);        }        protected static void replaceFont(String staticTypefaceFieldName,                final Typeface newTypeface) {            try {                final Field staticField = Typeface.class                        .getDeclaredField(staticTypefaceFieldName);                staticField.setAccessible(true);                staticField.set(null, newTypeface);            } catch (NoSuchFieldException e) {                e.printStackTrace();            } catch (IllegalAccessException e) {                e.printStackTrace();            }        }}


Use the app:itemTextAppearance="" property.Hope this helps.

 <android.support.design.widget.NavigationView        android:id="@+id/nav_view"        android:layout_width="wrap_content"        android:layout_height="match_parent"        android:layout_gravity="start"        android:fitsSystemWindows="true"        app:headerLayout="@layout/nav_header_main"        android:background="@drawable/nav_bg_gradient"        android:theme="@style/NavigationView"        app:itemIconTint="@color/colorWhite"        app:itemTextColor="@color/colorWhite"        app:itemTextAppearance="@style/NavigationText"        app:menu="@menu/main_drawer">

In styles.xml write

<style name="NavigationText" parent="@android:style/TextAppearance.Medium">        <item name="android:textColor">@color/colorWhite</item>        <item name="android:textSize">12sp</item>        <item name="android:fontFamily">sans-serif-thin</item>    </style>