टैब डिज़ाइन के टैब टेक्स्ट के फॉन्ट को टैबलैटआउट में बदलें


109

मैं TabLayoutएंड्रॉइड डिज़ाइन लाइब्रेरी से नए पर काम करने की कोशिश कर रहा हूं ।

मैं टैब टेक्स्ट को कस्टम फॉन्ट में बदलना चाहता हूं । और, मैं कुछ करने के लिए संबंधित स्टाइल खोज करने के लिए करने की कोशिश की TabLayoutहै, लेकिन करने के लिए समाप्त हो गया इस

कृपया मार्गदर्शन करें कि मैं टैब टेक्स्ट फोंट कैसे बदल सकता हूं।


3
Spannable String
NullByte

जवाबों:


37

Java Code या XML से एक TextView इस तरह बनाएं

<?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"
/>

आईडी को यहां रखना सुनिश्चित करें क्योंकि यदि आप कस्टम टेक्स्टव्यू का उपयोग करते हैं तो इस आईडी के लिए टैबलैट चेक करें

फिर कोड से इस लेआउट Typefaceको बढ़ाएं और उस टेक्स्टव्यू पर कस्टम सेट करें और टैब पर इस कस्टम दृश्य को जोड़ें

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);
}

2
मैं इस स्थिति में कैसे सेट tabTextColorऔर tabSelectedTextColorसंपत्ति बना सकता हूं ?
अलीरज़ा नूराली


162

यदि आप उपयोग कर रहे हैं TabLayoutऔर आप फ़ॉन्ट को बदलना चाहते हैं तो आपको लूप के लिए एक नया जोड़ना होगा इस तरह पिछले समाधान के लिए:

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);
                }
        }
    }
} 

कृपया शर्लक का उपयोग करके एक्शन बार टैब में फ़ॉन्ट शैली बदलने के लिए देखें


मैं एम पूर्वावलोकन का उपयोग नहीं कर रहा हूं। क्या इसे करने का कोई और तरीका है।
डोरी

1
आपको M पूर्वावलोकन की आवश्यकता नहीं है, यह सभी के लिए मान्य हैTabLayout
मारियो वेलकास्को

हालाँकि, मैं android.view.View android.support.design.widget.TabLayout.getChildAt (int) पर NullPointerException से मुठभेड़ कर रहा हूं, क्या आप मुझे इसे ठीक करने में मदद कर सकते हैं? मुझे नहीं पता कि मैं अपने कोड में क्या याद कर रहा हूँ।
brettbrdls 4

1
का पहला पैरामीटर setTypeFaceएक है TypeFace, अगर आप Fontकक्षा नहीं पा सकते हैं (जो मेरे लिए मौजूद नहीं है)
वाहिद अमीरी

104

अपनी खुद की कस्टम शैली बनाएं और मूल शैली का उपयोग करें parent="@android:style/TextAppearance.Widget.TabWidget"

और आपके टैब लेआउट में इस शैली का उपयोग करें app:tabTextAppearance="@style/tab_text"

उदाहरण: शैली:

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

उदाहरण: टैब लेआउट घटक:

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

9
यह सही है, मैं parent="TextAppearance.Design.Tab"अपने मामले में उपयोग कर रहा हूं ।
जेवर

1
यह पहले उत्तर की तुलना में बहुत अच्छा काम करता है, और काले जादू (छिपी
आपी

2
जब फॉन्टफली का उपयोग करें तो काम करें, फॉन्टपैथ का उपयोग करने पर काम न करें
ट्राम गुयेन

2
मैं अजीब अपवादों का उपयोग करते समय गलती से हो रहा था TextAppearance.Widget.TabWidget। @ जेवर का जवाब मेरे लिए तय है।
फंक्शनल 7

47

प्रवीण शर्मा का शानदार जवाब बस एक छोटा सा जोड़: changeTabsFont()आपको हर जगह उपयोग करने के बजाय TabLayout, आप बस अपना खुद का उपयोग कर सकते हैं 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);
            }
        }
    }

}

एक और बात। TabViewएक है LinearLayoutके साथ TextViewअंदर (यह भी वैकल्पिक शामिल कर सकते हैं ImageView)। तो आप कोड को और भी सरल बना सकते हैं:

@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);
}

लेकिन मैं इस तरह की सिफारिश नहीं करेंगे। यदि TabLayoutकार्यान्वयन बदल जाएगा, तो यह कोड अनुचित तरीके से काम कर सकता है या दुर्घटनाग्रस्त भी हो सकता है।

कस्टमाइज़ करने का दूसरा तरीका TabLayoutइसमें कस्टम दृश्य जोड़ रहा है। यहाँ महान उदाहरण है


यदि आप इस तरह टैब सेट करते हैं तो AddTab wiil इनवॉइस न करें: mViewPager.setAdapter (नया YourPagerAdapter (getChildFragmentManager ())); mTabLayout.setupWithViewPager (mViewPager);
पेनज़्ज़

2
@Penzzz आप बिल्कुल सही हैं। इस स्थिति में आपको कोड को addTab पद्धति से दूसरे स्थान पर ले जाना चाहिए। उदाहरण के लिए onMeasure।
आंद्रेई औलास्का

@AndreiAulaska thnx तुम मेरा दिन बचाओ। आपका आखिरी लिंक मुझे बचाओ
अमोल डेल

यह अब काम नहीं करता है मुझे लगता है कि नवीनतम संस्करण में। @ ejw का जवाब अब काम कर रहा है। AddTab (टैब टैब, बूलियन सेटलेक्टेड) ​​में इसे जोड़ने की आवश्यकता है
Sayem

3
यह अच्छा काम करता है। नोट: समर्थन पुस्तकालय 25.x के रूप में, आपको addTab(Tab tab, int position, boolean setSelected)इसके बजाय ओवरराइड करने की आवश्यकता है addTab(Tab tab)
विक्की चिजवानी

20

XMLचल रहे उपकरणों पर Android 4.1एपीआई समर्थन का उपयोग करने के लिए (एपीआई स्तर 16) और उच्चतर, समर्थन लाइब्रेरी 26+ का उपयोग करें।

  1. राइट क्लिक करें फ़ोल्डर
  2. नया -> Android संसाधन निर्देशिका-> फ़ॉन्ट चुनें -> ठीक है
  3. अपनी myfont.ttfफ़ाइल को नए बनाए गए फ़ॉन्ट फ़ोल्डर में रखें

पर res/values/styles.xmlजोड़ने:

<style name="customfontstyle" parent="@android:style/TextAppearance.Small">
    <item name="android:fontFamily">@font/myfont</item>
</style>

लेआउट फ़ाइल जोड़ें ऐप पर: tabTextAppearance = "@ style / customfontstyle",

<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabGravity="fill"
    app:tabTextAppearance="@style/customfontstyle"
    app:tabMode="fixed" />

कृपया [xml में फोंट] देखें। ( https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml )


यह xamarin रूपों और xamarin android.thanks पर काम करता है
Esmail

बहुत बढ़िया जवाब! "TextAppearance.Design.Tab" का विस्तार करना चाहिए
XY

16

निम्न विधि पूरी तरह से ViewGroupपुनरावर्ती में फ़ॉन्ट बदल जाएगी । मैंने इस पद्धति को इसलिए चुना क्योंकि आपको आंतरिक संरचना के बारे में परवाह नहीं है TabLayout। मैं एक फ़ॉन्ट सेट करने के लिए सुलेख पुस्तकालय का उपयोग कर रहा हूँ ।

void changeFontInViewGroup(ViewGroup viewGroup, String fontPath) {
    for (int i = 0; i < viewGroup.getChildCount(); i++) {
        View child = viewGroup.getChildAt(i);
        if (TextView.class.isAssignableFrom(child.getClass())) {
            CalligraphyUtils.applyFontToTextView(child.getContext(), (TextView) child, fontPath);
        } else if (ViewGroup.class.isAssignableFrom(child.getClass())) {
            changeFontInViewGroup((ViewGroup) viewGroup.getChildAt(i), fontPath);
        }
    }
}

1
इसके साथ समस्या यह है कि यदि आप लेआउट को व्यूपेजर से जोड़ते हैं, तो आप अनुकूलित फोंट खो देंगे।
बर्बाद

10

23.2.0 के डिज़ाइन समर्थन के लिए, setupWithViewPager का उपयोग करके, आपको कोड को टैब (टैब टैब) से एडटैब (टैब टैब, बूलियन सेटलेक्टेड) ​​पर ले जाना होगा।


8

आप इसका उपयोग कर सकते हैं, यह मेरे लिए काम करता है।

 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) {
                AssetManager mgr = getActivity().getAssets();
                Typeface tf = Typeface.createFromAsset(mgr, "fonts/Roboto-Regular.ttf");//Font file in /assets
                ((TextView) tabViewChild).setTypeface(tf);
            }
        }
    }
}

7

ठीक है, मैं एक पाश का उपयोग किए बिना 23.4.0 में इसे सरल पाया। केवल @ejw द्वारा सुझाए गए अनुसार addTab (@NonNull टैब टैब, बूलियन सेट किए गए) को ओवरराइड करें।

@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);
}

और यहाँ 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" />

आशा है कि यह मदद कर सकता है :)


1
लेकिन tabSlectedTextColor और tabTextColo कैसे सेट करें?
मुस्तफा इमरान

@MostafaImran के आपके संस्करण में android:textColor="@color/graylove"राज्य सूची चयनकर्ता होना चाहिए जिसके लिए राज्य-निर्दिष्ट रंग निर्दिष्ट हो
AA_PV

7

जैसा कि आंद्रेई ने उत्तर दिया, आप टैबलैटआउट क्लास का विस्तार करके फॉन्टफेस को बदल सकते हैं । और जैसा कि पेनजेज़ ने कहा, आप इसे एडटैब विधि में नहीं कर सकते । ओवरले विधि को बाइल के रूप में ओवरराइड करें :

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom){
    super.onLayout(changed, left, top, right, bottom);

    final ViewGroup tabStrip = (ViewGroup)getChildAt(0);
    final int tabCount = tabStrip.getChildCount();
    ViewGroup tabView;
    int tabChildCount;
    View tabViewChild;

    for(int i=0; i<tabCount; i++){
        tabView = (ViewGroup)tabStrip.getChildAt(i);
        tabChildCount = tabView.getChildCount();
        for(int j=0; j<tabChildCount; j++){
            tabViewChild = tabView.getChildAt(j);
            if(tabViewChild instanceof AppCompatTextView){
                if(fontFace == null){
                    fontFace = Typeface.createFromAsset(context.getAssets(), context.getString(R.string.IranSans));
                }
                ((TextView) tabViewChild).setTypeface(fontFace, Typeface.BOLD);
            }
        }
    }
}

OverLayout पद्धति को अधिलेखित करें, क्योंकि, जब आप ViewPager के साथ TabLayout को बाइंड करने के लिए setupWithViewPager विधि का उपयोग करते हैं, तो आपको सेट टेक्स्ट विधि के साथ या पेजर एडेप्टर में टैब पाठ सेट करना होगा और जब यह हुआ, तब ऑन-लाइन विधि को मूल व्यूग्रुप पर बुलाया जाता है ( TabLayout) और वह स्थान सेट करने के लिए fontface है। (TextView टेक्स्ट बदलने का कारण यह है कि माता-पिता की विधि पर कॉल करें - एक tabView के दो बच्चे हैं, एक है ImageView दूसरा है TextView)

एक और समाधान:

सबसे पहले, कोड की इन पंक्तियों:

    if(fontFace == null){
        fontFace = Typeface.createFromAsset(context.getAssets(), context.getString(R.string.IranSans));
    }

उपरोक्त समाधान में, दो छोरों के बाहर लिखा जाना चाहिए।

लेकिन एपीआई के लिए बेहतर समाधान > = 16 Android का उपयोग कर रहा है : fontFamily :

एक एंड्रॉइड रिसोर्स डायरेक्टरी नाम का फॉन्ट बनाएं और अपने इच्छित फॉन्ट को कॉपी करें।

फिर इन शैलियों का उपयोग करें:

<style name="tabLayoutTitles">
    <item name="android:textColor">@color/white</item>
    <item name="android:textSize">@dimen/appFirstFontSize</item>
    <item name="android:fontFamily">@font/vazir_bold</item>
</style>

<style name="defaultTabLayout">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">@dimen/defaultTabLayoutHeight</item>
    <item name="android:gravity">right</item>
    <item name="tabTextAppearance">@style/tabLayoutTitles</item>
    <item name="tabSelectedTextColor">@color/white</item>
    <item name="tabIndicatorColor">@color/white</item>
    <item name="tabIndicatorHeight">@dimen/accomTabIndicatorHeight</item>
    <item name="tabMode">fixed</item>
    <item name="tabGravity">fill</item>
    <item name="tabBackground">@drawable/rectangle_white_ripple</item>
    <item name="android:background">@color/colorPrimary</item>
</style>

यह एक बुरा प्रदर्शन फिक्स है, onLayout()जिसे टैब स्विचिंग जैसे हर लेआउट परिवर्तन के साथ बुलाया जाता है या यहां तक ​​कि टैब के नीचे स्क्रॉल करने की सूची भी होती है, forकई टैब TabLayoutऐप में नेस्टेड एस के साथ पिछड़ जाएगा।
अमृत ​​बरकत

2
@ अमर बराकत। इस लिंक के अनुसार: developer.android.com/reference/android/view/… , int, int, int, int), यह सच नहीं है। मैंने इसका परीक्षण भी किया। मैंने ऑन-लाईट विधि में एक विराम बिंदु डाला और इसे तब कहा जाता है जब टैब बनाया जा रहा है टैब स्विचिंग या सूची स्क्रॉलिंग पर नहीं।
Arash

1
मेरे onLayout()लिए कई बार कॉल किया जाता है जब टैब स्विचिंग (निश्चित रूप से क्यों बिल्कुल नहीं), लेकिन इसके लिए खाते में मैं केवल फ़ॉन्ट सेट करता हूं जब boolean changedयह सच है। ऐसा करना जो कई बार फोंट सेट करने से रोकता है।
रॉबर्ट

महान समाधान, कोई कोड की आवश्यकता है, केवल xml विशेषताएँ
सावधान

3

मेरा संकल्प तरीका इस तरह से है, निर्दिष्ट टैब टेक्स्ट को बदलें,

 ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);
 ViewGroup vgTab = (ViewGroup) vg.getChildAt(1);
 View tabViewChild = vgTab.getChildAt(1);
 if (tabViewChild instanceof TextView) {
      ((TextView) tabViewChild).setText(str);
 }

2
I think this is easier way.

<android.support.design.widget.TabLayout
   android:id="@+id/tabs"
   app:tabTextColor="@color/lightPrimary"
   app:tabSelectedTextColor="@color/white"
   style="@style/CustomTabLayout"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"/>
<style name="CustomTabLayout" parent="Widget.Design.TabLayout">
   <item name="tabMaxWidth">20dp</item>
   <item name="tabMode">scrollable</item>
   <item name="tabIndicatorColor">?attr/colorAccent</item>
   <item name="tabIndicatorHeight">2dp</item>
   <item name="tabPaddingStart">12dp</item>
   <item name="tabPaddingEnd">12dp</item>
   <item name="tabBackground">?attr/selectableItemBackground</item>
   <item name="tabTextAppearance">@style/CustomTabTextAppearance</item>
   <item name="tabSelectedTextColor">?android:textColorPrimary</item>
</style>
<style name="CustomTabTextAppearance" parent="TextAppearance.Design.Tab">
   <item name="android:textSize">16sp</item>
   <item name="android:textStyle">bold</item>
   <item name="android:textColor">?android:textColorSecondary</item>
   <item name="textAllCaps">false</item>
</style>

2

कोटलिन एक्सटेंशन जो मेरे लिए काम करता है:

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

1

मेरा 2 पी, संदर्भ जाँच के साथ कोटलिन, हर जगह लागू है क्योंकि यह कुछ गलत है तो बंद हो जाएगा।

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

1

और यहाँ कोटलिन में मेरा कार्यान्वयन है जो चयनित और अचयनित टैब के लिए परिवर्तन फ़ॉन्ट की भी अनुमति देता है।

class FontTabLayout @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    @AttrRes defStyleAttr: Int = 0
) : TabLayout(context, attrs, defStyleAttr) {

    private var textSize = 14f

    private var defaultSelectedPosition = 0

    private var selectedTypeFace: Typeface? = ResourcesCompat.getFont(context, R.font.muli_bold)
    private var normalTypeFace: Typeface? = ResourcesCompat.getFont(context, R.font.muli_regular)

    @ColorInt private var selectedColor = 0
    @ColorInt private var normalTextColor = 0

    init {
        attrs?.let { initAttrs(it) }
        addOnTabSelectedListener()
    }

    private fun initAttrs(attrs: AttributeSet) {
        val a = context.obtainStyledAttributes(attrs, R.styleable.FontTabLayout)

        textSize = a.getDimensionPixelSize(R.styleable.FontTabLayout_textSize, 14).toFloat()

        defaultSelectedPosition = a.getInteger(R.styleable.FontTabLayout_defaultSelectedPosition, 0)
        val selectedResourceId = a.getResourceId(R.styleable.FontTabLayout_selectedTypeFace, R.font.muli_bold)
        val normalResourceId = a.getResourceId(R.styleable.FontTabLayout_normalTypeFace, R.font.muli_regular)

        selectedColor = a.getColor(com.google.android.material.R.styleable.TabLayout_tabSelectedTextColor, 0)
        normalTextColor = a.getColor(R.styleable.FontTabLayout_normalTextColor, 0)

        selectedTypeFace = ResourcesCompat.getFont(context, selectedResourceId)
        normalTypeFace = ResourcesCompat.getFont(context, normalResourceId)

        a.recycle()
    }

    private fun addOnTabSelectedListener() {
        addOnTabSelectedListener(object : OnTabSelectedListenerAdapter() {

            override fun onTabUnselected(tab: Tab?) {
                getCustomViewFromTab(tab)?.apply {
                    setTextColor(normalTextColor)
                    typeface = normalTypeFace
                }
            }

            override fun onTabSelected(tab: Tab?) {

                getCustomViewFromTab(tab)?.apply {
                    setTextColor(selectedColor)
                    typeface = selectedTypeFace
                }
            }

            private fun getCustomViewFromTab(tab: Tab?) = tab?.customView as? AppCompatTextView

        })
    }

    override fun setupWithViewPager(viewPager: ViewPager?, autoRefresh: Boolean) {
        super.setupWithViewPager(viewPager, autoRefresh)
        addViews(viewPager)
    }

    private fun addViews(viewPager: ViewPager?) {
        for (i in 0 until tabCount) {
            val customTabView = getCustomTabView(i).apply {
                typeface = if (i == defaultSelectedPosition) selectedTypeFace else normalTypeFace
                val color = if (i == defaultSelectedPosition) selectedColor else normalTextColor
                setTextColor(color)
                text = viewPager?.adapter?.getPageTitle(i)
            }

            getTabAt(i)?.customView = customTabView
        }
    }

    private fun getCustomTabView(position: Int): AppCompatTextView {
        return AppCompatTextView(context).apply {
            gravity = Gravity.CENTER
            textSize = this@FontTabLayout.textSize
            text = position.toString()
        }
    }
}

in attrs.xml:

<declare-styleable name="FontTabLayout">
    <attr name="normalTextColor" format="reference|color" />
    <attr name="textSize" format="dimension" />
    <attr name="defaultSelectedPosition" format="integer" />
    <attr name="selectedTypeFace" format="reference" />
    <attr name="normalTypeFace" format="reference" />
</declare-styleable>

tabs.getTabAt (1 )-- टेक्स्ट डायनामिक रूप से, एक बार सेट होने पर बदल नहीं रहा है।
शनरिषन

0

कोटलिन विस्तार कार्यों के साथ इसका उपयोग करें:

 fun TabLayout.setFontSizeAndColor(typeface: Typeface, @DimenRes textSize: Int, @ColorRes textColor: Int) {
val viewGroup: ViewGroup = this.getChildAt(0) as ViewGroup
val tabsCount: Int = viewGroup.childCount
for (j in 0 until tabsCount) {
    val viewGroupTab: ViewGroup = viewGroup.getChildAt(j) as ViewGroup
    val tabChildCount: Int = viewGroupTab.childCount
    for (i in 0 until tabChildCount) {
        val tabViewChild: View = viewGroupTab.getChildAt(i) as View
        if ( tabViewChild is TextView) {
            tabViewChild.typeface = typeface
            tabViewChild.gravity = Gravity.FILL
            tabViewChild.maxLines = 1
            tabViewChild.setTextSize(TypedValue.COMPLEX_UNIT_PX, this.resources.getDimension(textSize))
            tabViewChild.setTextColor(ContextCompat.getColor(this.context, textColor))
        }
    }
}

}


-2

परिवर्तन

if (tabViewChild instanceof TextView) {

के लिये

if (tabViewChild instanceof AppCompatTextView) { 

android.support.design.widget.TabLayout के साथ काम करने के लिए (कम से कम com.android.support:design:23.2.0 से)


4
लेकिन AppCompatTextView TextView का विस्तार करता है, इसलिए इससे क्या फर्क पड़ेगा?
शिरनी Sh५
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.