Ändern Sie die Schriftart des Tab-Textes in TabLayout für Android-Design

109

Ich versuche an dem neuen zu arbeiten TabLayout aus der Android Design Library zu arbeiten.

Ich möchte den Tabulatortext in eine benutzerdefinierte Schriftart ändern . Und ich habe versucht, nach Styling zu suchen, bin TabLayoutaber dazu gekommen .

Bitte geben Sie an, wie ich die Schriftarten auf der Registerkarte ändern kann.

Dory
quelle
3
Verwenden Sie Spannable String
NullByte

Antworten:

37

Erstellen Sie eine Textansicht aus Java Code oder XML wie folgt

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

Stellen Sie sicher, dass die ID unverändert bleibt, da das TabLayout nach dieser ID sucht, wenn Sie eine benutzerdefinierte Textansicht verwenden

TypefaceBlasen Sie dann dieses Layout aus dem Code auf, legen Sie die benutzerdefinierte Ansicht für diese Textansicht fest und fügen Sie diese benutzerdefinierte Ansicht der Registerkarte hinzu

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);
}
Farmaan Elahi
quelle
2
Wie kann ich in dieser Situation festlegen tabTextColorund tabSelectedTextColorEigentum?
Alireza Noorali
Ich bekomme die Lösung von Praveen Sharmas Antwort
Alireza Noorali
161

Wenn Sie verwenden TabLayoutund die Schriftart ändern möchten, müssen Sie der vorherigen Lösung wie folgt eine neue for-Schleife hinzufügen:

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

Weitere Informationen finden Sie unter Ändern des Schriftstils in den Registerkarten der Aktionsleiste mithilfe von Sherlock

Praveen Sharma
quelle
Ich verwende keine M-Vorschau. Gibt es eine andere Möglichkeit, dies zu tun?
Dory
1
Sie brauchen keine M-Vorschau, sie gilt für alle BenutzerTabLayout
Mario Velasco
Bei android.view.View android.support.design.widget.TabLayout.getChildAt (int) tritt jedoch eine NullPointerException auf. Können Sie mir helfen, diese zu beheben? Ich kann nicht finden, was mir in meinem Code fehlt.
Brettbrdls
1
Der erste Parameter von setTypeFaceist a TypeFace, falls Sie die FontKlasse nicht finden können (die für mich nicht zu existieren scheint)
Vahid Amiri
103

Erstellen Sie Ihren eigenen benutzerdefinierten Stil und verwenden Sie den übergeordneten Stil als parent="@android:style/TextAppearance.Widget.TabWidget"

Verwenden Sie diesen Stil in Ihrem Registerkartenlayout als app:tabTextAppearance="@style/tab_text"

Beispiel: Stil:

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

Beispiel: Tab-Layout-Komponente:

<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" />
Milind Mevada
quelle
9
Das ist richtig, ich benutze parent="TextAppearance.Design.Tab"in meinem Fall.
Javatar
1
Dies funktioniert viel besser als die ersten Antworten und ohne schwarze Magie (versteckte API), die in Zukunft etwas
kaputt machen
2
Arbeiten Sie einfach, wenn Sie fontFamily verwenden, nicht, wenn Sie fontPath
Tram Nguyen verwenden.
2
Ich bekam seltsame Ausnahmen unregelmäßig bei der Verwendung TextAppearance.Widget.TabWidget. @Javatars Antwort hat es für mich behoben.
Funktion7
47

Tolle Antwort von Praveen Sharma. Nur eine kleine Ergänzung: Anstatt changeTabsFont()überall zu verwenden TabLayout, können Sie einfach Ihre eigenen verwenden 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);
            }
        }
    }

}

Und noch etwas. TabViewist ein LinearLayoutwith TextViewinside (kann optional auch enthalten ImageView). So können Sie den Code noch einfacher gestalten:

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

Aber ich würde diesen Weg nicht empfehlen. WennTabLayout Implementierung ändert, kann dieser Code nicht ordnungsgemäß funktionieren oder sogar abstürzen.

Eine andere Möglichkeit zum Anpassen TabLayoutist das Hinzufügen einer benutzerdefinierten Ansicht. Hier ist das gute Beispiel .

Andrei Aulaska
quelle
addTab wird nicht aufgerufen, wenn Sie folgende Registerkarten festlegen: mViewPager.setAdapter (neuer YourPagerAdapter (getChildFragmentManager ())); mTabLayout.setupWithViewPager (mViewPager);
Penzzz
2
@Penzzz du hast absolut recht. In diesem Fall sollten Sie den Code von der addTab-Methode in eine andere verschieben. Zum Beispiel onMeasure.
Andrei Aulaska
@AndreiAulaska Danke Du rettest meinen Tag. Dein letzter Link rette mich.
Amol Dale
das funktioniert nicht mehr ich denke in der neuesten version. Die Antwort von @ ejw funktioniert jetzt. müssen in addTab hinzugefügt werden (Registerkarte Tab, boolean setSelected)
Sayem
3
Das funktioniert gut. HINWEIS: Ab der Support-Bibliothek 25.x müssen Sie überschreibenaddTab(Tab tab, int position, boolean setSelected) stattaddTab(Tab tab) .
Vicky Chijwani
20

Verwenden Sie die Support Library 26+, um die Schriftartenunterstützung in XMLFunktionen auf Geräten zu verwenden, die ausgeführt werden Android 4.1(API-Stufe 16) und höher.

  1. Klicken Sie mit der rechten Maustaste auf den Ordner res
  2. Neu -> Android-Ressourcenverzeichnis-> Schriftart auswählen -> Ok
  3. Legen Sie Ihre myfont.ttfDatei in einem neu erstellten Schriftartenordner ab

Auf res/values/styles.xmladd:

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

Fügen Sie in der Layoutdatei die App hinzu: 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" />

Weitere Informationen finden Sie unter [Schriftarten in XML]. ( Https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml )

Thomas VJ
quelle
es funktioniert auf xamarin Formen und xamarin android.thanks
Esmail Jamshidiasl
Gute Antwort! Sollte "TextAppearance.Design.Tab" allerdings erweitern
XY
16

Die folgende Methode ändert die Schriftart vollständig ViewGrouprekursiv. Ich habe diese Methode gewählt, weil Sie sich nicht um die innere Struktur von kümmern müssen TabLayout. Ich verwende die Kalligraphiebibliothek , um eine Schriftart festzulegen.

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);
        }
    }
}
Egis
quelle
1
Das Problem dabei ist, dass Sie die angepassten Schriftarten verlieren, wenn Sie das Layout an einen Viewpager anhängen.
Rupps
10

Für die Designunterstützung 23.2.0 müssen Sie mit setupWithViewPager den Code von addTab (Registerkarte Tab) nach addTab (Registerkarte Tab, boolean setSelected) verschieben.

ejw
quelle
8

Sie können dies verwenden, es funktioniert für mich.

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

Nun, ich fand es einfach in 23.4.0 ohne Verwendung einer Schleife. Überschreiben Sie einfach addTab (Registerkarte @NonNull Tab, boolean setSelected), wie von @ejw vorgeschlagen.

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

Und hier ist das 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" />

Hoffe es könnte helfen :)

elsennov
quelle
1
Aber wie man tabSelectedTextColor und tabTextColo setzt?
Mostafa Imran
@MostafaImran Ihre Version von android:textColor="@color/graylove"sollte die Statuslistenauswahl für die mit state_selected Farbe angegeben haben
AA_PV
7

Wie Andrei antwortete, können Sie die Schriftart ändern, indem Sie die TabLayout- Klasse erweitern. Und wie Penzzz sagte, können Sie dies nicht mit der addTab- Methode tun . Außer Kraft setzen onLayout- Verfahren wie unten:

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

OnLayout-Methode muss überschrieben werden, da bei Verwendung von setupWithViewPager Methode zum Binden des TabLayout mit dem ViewPager den Tabulatortext entweder mit der setText-Methode oder danach im PagerAdapter festlegen müssen. In diesem Fall wird die onLayout-Methode in der übergeordneten ViewGroup aufgerufen ( TabLayout) und hier können Sie die Schriftart für die Einstellung einfügen. (Wenn Sie einen TextView-Text ändern, wird die onLayout-Methode des übergeordneten Elements aufgerufen. Ein tabView hat zwei untergeordnete Elemente, eines ist ImageView, ein anderes ist TextView.)

Eine andere Lösung:

Erstens diese Codezeilen:

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

In der obigen Lösung sollte außerhalb von zwei Schleifen geschrieben werden.

Eine bessere Lösung für API> = 16 ist die Verwendung von android: fontFamily :

Erstellen Sie ein Android-Ressourcenverzeichnis mit dem Namen font und kopieren Sie die gewünschte Schriftart in das Verzeichnis.

Verwenden Sie dann diese Stile:

<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>
Arash
quelle
Dies ist eine schlechte Leistungskorrektur, onLayout()die bei jeder Layoutänderung wie dem Wechseln von Registerkarten oder sogar dem Scrollen von Listen unter den Registerkarten aufgerufen wurde. Verschachtelte fors in einer TabLayoutApp mit vielen Registerkarten sind verzögert.
Amr Barakat
2
@ Amr Barakat. Laut diesem Link: developer.android.com/reference/android/view/… , int, int, int, int) ist dies nicht wahr. Ich habe es auch getestet. Ich habe einen Haltepunkt in die onLayout- Methode eingefügt und dieser wird aufgerufen, wenn die Registerkarten erstellt werden, nicht beim Wechseln der Registerkarten oder beim Scrollen der Liste.
Arash
1
Für mich onLayout()wird beim Tab-Wechsel mehrmals aufgerufen (nicht sicher warum genau), aber um dies zu berücksichtigen, setze ich die Schriftarten nur, wenn das boolean changedwahr ist. Dadurch wird verhindert, dass die Schriftarten mehrmals festgelegt werden.
Robert
Tolle Lösung, kein Code erforderlich, nur XML-Attribute
vorsichtig7j
3

Meine Auflösungsmethode ändert einfach den angegebenen Tabulatortext.

 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);
 }
Smish Jack
quelle
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>
sudhakara ks
quelle
2

Kotlin-Erweiterung, die für mich funktioniert hat:

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)
                }
            }
        }
    }
}
Michał Dobi Dobrzański
quelle
1

Mein 2p, Kotlin mit Referenzprüfung, überall anwendbar, da es aufhört, wenn etwas nicht stimmt.

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) }
            }
}
Rafael Ruiz Muñoz
quelle
1

Und hier ist meine Implementierung in Kotlin, die auch das Ändern der Schriftart für ausgewählte und nicht ausgewählte Registerkarten ermöglicht.

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>
Yvgen
quelle
tabs.getTabAt (1)?. Text ändert den Text nach dem Festlegen nicht dynamisch.
Shanraisshan
0

Verwenden Sie bei Kotlin-Erweiterungsfunktionen Folgendes:

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

}}

Kyriakos Georgiopoulos
quelle
-2

Veränderung

if (tabViewChild instanceof TextView) {

zum

if (tabViewChild instanceof AppCompatTextView) { 

damit es mit android.support.design.widget.TabLayout funktioniert (zumindest von com.android.support:design:23.2.0)

Penzzz
quelle
4
Aber AppCompatTextView erweitert TextView. Warum sollte dies einen Unterschied machen?
Shirane85