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
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>