Change the font of tab text in android design support TabLayout Change the font of tab text in android design support TabLayout android android

Change the font of tab text in android design support TabLayout


If you are using TabLayout and you want to change the font you have to add a new for loop to the previous solution like this:

private void changeTabsFont() {    ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);        int tabsCount = vg.getChildCount();        for (int j = 0; j < tabsCount; j++) {            ViewGroup vgTab = (ViewGroup) vg.getChildAt(j);            int tabChildsCount = vgTab.getChildCount();            for (int i = 0; i < tabChildsCount; i++) {                View tabViewChild = vgTab.getChildAt(i);                if (tabViewChild instanceof TextView) {                    ((TextView) tabViewChild).setTypeface(Font.getInstance().getTypeFace(), Typeface.NORMAL);                }        }    }} 

Please refer to change font style in action bar tabs using sherlock


Create your own custom style and use parent style as parent="@android:style/TextAppearance.Widget.TabWidget"

And in your tab layout use this style as app:tabTextAppearance="@style/tab_text"

Example:Style:

<style name="tab_text" parent="@android:style/TextAppearance.Widget.TabWidget">    <item name="android:fontFamily">@font/poppins_regular</item></style>

Example: Tab layout component:

<android.support.design.widget.TabLayout        android:id="@+id/tabLayout"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="?attr/colorPrimary"        android:minHeight="?attr/actionBarSize"        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"        app:tabTextAppearance="@style/tab_text" />


Great answer from praveen Sharma. Just a small addition:Instead of using changeTabsFont() everywhere you need TabLayout, you can simply use your own CustomTabLayout.

import android.content.Context;import android.graphics.Typeface;import android.support.design.widget.TabLayout;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class CustomTabLayout extends TabLayout {    private Typeface mTypeface;    public CustomTabLayout(Context context) {        super(context);        init();    }    public CustomTabLayout(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    private void init() {        mTypeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/Roboto-Regular.ttf");    }    @Override    public void addTab(Tab tab) {        super.addTab(tab);        ViewGroup mainView = (ViewGroup) getChildAt(0);        ViewGroup tabView = (ViewGroup) mainView.getChildAt(tab.getPosition());        int tabChildCount = tabView.getChildCount();        for (int i = 0; i < tabChildCount; i++) {            View tabViewChild = tabView.getChildAt(i);            if (tabViewChild instanceof TextView) {                ((TextView) tabViewChild).setTypeface(mTypeface, Typeface.NORMAL);            }        }    }}

And one more thing.TabView is a LinearLayout with TextView inside (it can also optionally contain ImageView). So you can make the code even simpler:

@Overridepublic void addTab(Tab tab) {    super.addTab(tab);    ViewGroup mainView = (ViewGroup) getChildAt(0);    ViewGroup tabView = (ViewGroup) mainView.getChildAt(tab.getPosition());    View tabViewChild = tabView.getChildAt(1);    ((TextView) tabViewChild).setTypeface(mTypeface, Typeface.NORMAL);}

But I wouldn't recommend this way. If TabLayout implementation will change, this code can work improperly or even crash.

Another way to customise TabLayout is adding custom view to it. Here is the great example.