Change the font of tab text in android design support TabLayout

前端 未结 18 1473
执念已碎
执念已碎 2020-11-27 13:38

I\'m trying to work on the new TabLayout from the android design library.

I want to change tab text to custom font. And,I tried to sear

相关标签:
18条回答
  • 2020-11-27 14:15

    Well, i found it simple in 23.4.0 without using a loop. Just override addTab(@NonNull Tab tab, boolean setSelected) as suggested by @ejw.

    @Override
    public void addTab(@NonNull Tab tab, boolean setSelected) {
        CoralBoldTextView coralTabView = (CoralBoldTextView) View.inflate(getContext(), R.layout.coral_tab_layout_view, null);
        coralTabView.setText(tab.getText());
        tab.setCustomView(coralTabView);
    
        super.addTab(tab, setSelected);
    }
    

    And here is the XML

    <?xml version="1.0" encoding="utf-8"?>
    <id.co.coralshop.skyfish.ui.CoralBoldTextView
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/custom_text"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:ellipsize="end"
       android:gravity="center"
       android:singleLine="true"
       android:textColor="@color/graylove"
       android:textSize="@dimen/tab_text_size" />
    

    Hope it could help :)

    0 讨论(0)
  • 2020-11-27 14:20

    Create a TextView from Java Code or XML like this

    <?xml version="1.0" encoding="utf-8"?>
    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:textSize="15sp"
        android:textColor="@color/tabs_default_color"
        android:gravity="center"
        android:layout_height="match_parent"
    />
    

    Make sure to keep the id as it is here because the TabLayout check for this ID if you use custom textview

    Then from code inflate this layout and set the custom Typeface on that textview and add this custom view to the tab

    for (int i = 0; i < tabLayout.getTabCount(); i++) {
         //noinspection ConstantConditions
         TextView tv = (TextView)LayoutInflater.from(this).inflate(R.layout.custom_tab,null)
         tv.setTypeface(Typeface);       
         tabLayout.getTabAt(i).setCustomView(tv);
    }
    
    0 讨论(0)
  • 2020-11-27 14:20

    Kotlin extension that worked for me:

    fun TabLayout.setFont(font: FontUtils.Fonts) {
        val vg = this.getChildAt(0) as ViewGroup
        for (i: Int in 0..vg.childCount) {
            val vgTab = vg.getChildAt(i) as ViewGroup?
            vgTab?.let {
                for (j: Int in 0..vgTab.childCount) {
                    val tab = vgTab.getChildAt(j)
                    if (tab is TextView) {
                        tab.typeface = FontUtils.getTypeFaceByFont(FontUtils.Fonts.BOLD, context)
                    }
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-27 14:20

    My 2p, Kotlin with reference checking, applicable everywhere as it will stop if something is wrong.

    private fun setTabLayouFont(tabLayout: TabLayout) {
        val viewGroupTabLayout = tabLayout.getChildAt(0) as? ViewGroup?
        (0 until (viewGroupTabLayout?.childCount ?: return))
                .map { viewGroupTabLayout.getChildAt(it) as? ViewGroup? }
                .forEach { viewGroupTabItem ->
                    (0 until (viewGroupTabItem?.childCount ?: return))
                            .mapNotNull { viewGroupTabItem.getChildAt(it) as? TextView }
                            .forEach { applyDefaultFontToTextView(it) }
                }
    }
    
    0 讨论(0)
  • 2020-11-27 14:21

    If you are using

    com.google.android.material:material:1.2.0 (latest version)

    <style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab">
            <item name="fontFamily">Your Font</item>
            <item name="android:fontFamily">Your Font</item>
            <item name="textAllCaps">false</item>
        </style>
    
    <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabBackground="@color/colorPrimary"
            app:tabGravity="fill"
            app:tabIndicatorColor="@color/white"
            app:tabMode="fixed"
            app:tabTextAppearance="@style/MyCustomTabTextAppearance"
            app:tabTextColor="@android:color/white" />
    
    0 讨论(0)
  • 2020-11-27 14:22

    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:

    @Override
    public 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.

    0 讨论(0)
提交回复
热议问题