Thay đổi phông chữ của văn bản tab trong hỗ trợ thiết kế Android TabLayout


109

Tôi đang cố gắng làm việc trên cái mới TabLayouttừ thư viện thiết kế Android.

Tôi muốn thay đổi văn bản tab thành phông chữ tùy chỉnh . Và, tôi đã cố gắng tìm kiếm một số phong cách liên quan đến TabLayout, nhưng cuối cùng vẫn chỉ là điều này .

Vui lòng hướng dẫn cách tôi có thể thay đổi phông chữ văn bản tab.


3
Sử dụng Spannable Chuỗi
NullByte

Câu trả lời:


37

Tạo TextView từ Java Code hoặc XML như thế này

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

Đảm bảo giữ id như ở đây vì TabLayout kiểm tra ID này nếu bạn sử dụng textview tùy chỉnh

Sau đó, từ mã thổi phồng bố cục này và đặt tùy chỉnh Typefacetrên chế độ xem văn bản đó và thêm chế độ xem tùy chỉnh này vào 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);
}

2
Làm thế nào tôi có thể thiết lập tabTextColortabSelectedTextColortài sản trong tình huống này?
Alireza Noorali

Tôi có được giải pháp từ câu trả lời Praveen Sharma của
Alireza Noorali

162

Nếu bạn đang sử dụng TabLayoutvà bạn muốn thay đổi phông chữ, bạn phải thêm một vòng lặp for mới vào giải pháp trước đó như sau:

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

Vui lòng tham khảo cách thay đổi kiểu phông chữ trong các tab trên thanh tác vụ bằng sherlock


Tôi không sử dụng M xem trước. CÒn cách nào khác để thực hiện việc này không.
Dory

1
Bạn không cần phải M preview, nó có giá trị cho mọi người sử dụngTabLayout
Mario Velasco

Tuy nhiên, tôi đang gặp phải lỗi NullPointerException trên android.view.View android.support.design.widget.TabLayout.getChildAt (int), bạn có thể giúp tôi cách khắc phục nó không? Không thể tìm thấy những gì tôi đang thiếu trên mã của tôi.
brettbrdls

1
Tham số đầu tiên của setTypeFaceTypeFace, trong trường hợp nếu bạn không thể tìm thấy Fontlớp (mà không xuất hiện để tồn tại đối với tôi)
Vahid Amiri

104

Tạo kiểu tùy chỉnh của riêng bạn và sử dụng kiểu gốc làm parent="@android:style/TextAppearance.Widget.TabWidget"

Và trong bố cục tab của bạn, hãy sử dụng kiểu này như app:tabTextAppearance="@style/tab_text"

Ví dụ: Phong cách:

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

Ví dụ: Thành phần bố cục tab:

<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
Điều này là chính xác, tôi đang sử dụng parent="TextAppearance.Design.Tab"trong trường hợp của tôi.
Javatar

1
Này hoạt động tốt hơn nhiều so với câu trả lời đầu tiên, và không có ma thuật đen (ẩn api), mà có thể phá vỡ một cái gì đó trong tương lai
Sulfkain

2
Chỉ hoạt động khi sử dụng fontFamily, không hoạt động khi sử dụng fontPath
Tram Nguyen

2
Tôi đã nhận được các ngoại lệ kỳ lạ một cách thất thường khi sử dụng TextAppearance.Widget.TabWidget. Câu trả lời của @Javatar đã sửa nó cho tôi.
funct7

47

Câu trả lời tuyệt vời từ Praveen Sharma. Chỉ là một bổ sung nhỏ: Thay vì sử dụng changeTabsFont()ở mọi nơi bạn cần TabLayout, bạn có thể đơn giản sử dụng của riêng bạn 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);
            }
        }
    }

}

Và một điều nữa. TabViewlà một LinearLayoutvới TextViewbên trong (nó cũng có thể tùy chọn chứa ImageView). Vì vậy, bạn có thể làm cho mã đơn giản hơn:

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

Nhưng tôi không khuyên bạn nên làm theo cách này. Nếu TabLayoutquá trình triển khai sẽ thay đổi, mã này có thể hoạt động không đúng cách hoặc thậm chí bị lỗi.

Một cách khác để tùy chỉnh TabLayoutlà thêm chế độ xem tùy chỉnh vào nó. Đây là ví dụ tuyệt vời .


addTab wiil không gọi trong trường hợp bạn đặt các tab như sau: mViewPager.setAdapter (YourPagerAdapter mới (getChildFragmentManager ())); mTabLayout.setupWithViewPager (mViewPager);
Penzzz

2
@Penzzz bạn hoàn toàn đúng. Trong trường hợp này, bạn nên di chuyển mã từ phương thức addTab sang phương thức khác. Ví dụ onMeasure.
Andrei Aulaska

@AndreiAulaska thnx Bạn đã cứu một ngày của tôi. Liên kết cuối cùng của bạn cứu tôi.
Amol Dale,

Điều này không hoạt động nữa, tôi nghĩ trong phiên bản mới nhất. Câu trả lời của @ ejw hiện đang hoạt động. cần phải thêm nó vào addTab (Tab Tab, boolean setSelected)
Sayem

3
Điều này hoạt động tốt. LƯU Ý: đối với thư viện hỗ trợ 25.x, bạn cần ghi đè addTab(Tab tab, int position, boolean setSelected)thay vì addTab(Tab tab).
Vicky Chijwani

20

Để sử dụng hỗ trợ phông chữ trong XMLtính năng trên các thiết bị đang chạy Android 4.1(API cấp 16) trở lên, hãy sử dụng Thư viện hỗ trợ 26+.

  1. Nhấp chuột phải vào thư mục res
  2. Mới -> Thư mục tài nguyên Android-> chọn phông chữ -> Ok
  3. Đặt myfont.ttftệp của bạn vào thư mục phông chữ mới tạo

Mở res/values/styles.xmlthêm:

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

Trên tệp bố cục, hãy thêm ứng dụng: 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" />

Vui lòng tham khảo [phông chữ trong xml]. ( Https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml )


nó hoạt động trên hình thức Xamarin và Xamarin android.thanks
Esmail Jamshidiasl

Câu trả lời chính xác! Tuy nhiên, nên mở rộng "TextAppearance.Design.Tab"
XY

16

Phương pháp sau sẽ thay đổi toàn bộ phông chữ một ViewGroupcách đệ quy. Tôi chọn phương pháp này vì bạn không cần phải quan tâm đến cấu trúc bên trong của TabLayout. Tôi đang sử dụng thư viện Thư pháp để đặt phông chữ.

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
vấn đề với điều này là, nếu bạn đính kèm bố cục vào Viewpager, bạn sẽ mất các phông chữ tùy chỉnh.
rupps

10

Để hỗ trợ thiết kế 23.2.0, sử dụng setupWithViewPager, bạn sẽ phải di chuyển mã từ addTab (Tab tab) sang addTab (Tab tab, boolean setSelected).


8

Bạn có thể sử dụng cái này, nó phù hợp với tôi.

 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

Chà, tôi thấy nó đơn giản trong 23.4.0 mà không cần sử dụng vòng lặp. Chỉ cần ghi đè addTab (tab @NonNull Tab, boolean setSelected) theo đề xuất của @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);
}

Và đây là 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" />

Hy vọng nó có thể giúp :)


1
Nhưng làm thế nào để đặt tabSelectedTextColor và tabTextColo?
Mostafa Imran

@MostafaImran phiên bản của android:textColor="@color/graylove"bạn phải có bộ chọn danh sách trạng thái cho phiên bản đó với màu state_selected được chỉ định
AA_PV 27/12/16

7

Như Andrei đã trả lời, bạn có thể thay đổi phông chữ bằng cách mở rộng lớp TabLayout . Và như Penzzz đã nói, bạn không thể làm điều đó trong phương thức addTab . Ghi đè phương thức onLayout như bên dưới:

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

Phải ghi đè phương thức onLayout, bởi vì, khi bạn sử dụng phương thức setupWithViewPager để liên kết TabLayout với ViewPager, bạn phải đặt văn bản tab bằng phương thức setText hoặc trong PagerAdapter sau đó và khi điều này xảy ra, phương thức onLayout được gọi trên ViewGroup mẹ ( TabLayout) và đó là nơi để đặt fontface thiết lập. (Thay đổi văn bản TextView gây ra việc gọi phương thức onLayout của nó là cha - Một tabView có hai con, một là ImageView, một là TextView)

Giải pháp khác:

Đầu tiên, những dòng mã sau:

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

Trong giải pháp trên, nên được viết bên ngoài hai vòng lặp.

Nhưng giải pháp tốt hơn cho API> = 16 là sử dụng android: fontFamily :

Tạo một phông chữ có tên trong Thư mục tài nguyên Android và sao chép phông chữ mong muốn của bạn vào thư mục.

Sau đó, sử dụng các kiểu sau:

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

Đây là một bản sửa lỗi hiệu suất kém, onLayout()được gọi với mọi thay đổi bố cục như chuyển đổi tab hoặc thậm chí cuộn danh sách bên dưới các tab, với forcác TabLayoutứng dụng lồng nhau trong nhiều tab sẽ bị lag.
Amr Barakat

2
@Amr Barakat. Theo liên kết này: developer.android.com/reference/android/view/… , int, int, int, int), điều này không đúng. Tôi cũng đã thử nghiệm nó. Tôi đặt một điểm ngắt trong phương thức onLayout và nó được gọi khi các tab đang được tạo không phải trên chuyển đổi tab hoặc cuộn danh sách.
Arash

1
Đối với tôi, onLayout()nó được gọi nhiều lần khi chuyển đổi tab (không chắc tại sao chính xác), nhưng để giải thích điều này, tôi chỉ đặt phông chữ khi boolean changedđúng. Làm điều đó ngăn cản việc đặt phông chữ nhiều lần.
Robert

giải pháp tuyệt vời, không cần mã, chỉ thuộc tính xml
cẩn thận7j

3

Phương pháp Giải quyết của tôi giống như thế này, thay đổi văn bản tab Đã chỉ định,

 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

Phần mở rộng Kotlin phù hợp với tôi:

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

2p của tôi, Kotlin với kiểm tra tham chiếu, có thể áp dụng ở mọi nơi vì nó sẽ dừng nếu có gì đó sai.

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

Và đây là cách triển khai của tôi trong Kotlin cũng cho phép thay đổi phông chữ cho các tab đã chọn và không được chọn.

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

trong 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) ?. văn bản không thay đổi văn bản động, sau khi được đặt.
shanraisshan

0

Với các chức năng mở rộng kotlin, hãy sử dụng điều này:

 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

Thay đổi

if (tabViewChild instanceof TextView) {

cho

if (tabViewChild instanceof AppCompatTextView) { 

để làm cho nó hoạt động với android.support.design.widget.TabLayout (ít nhất là từ com.android.support:design:23.2.0)


4
nhưng AppCompatTextView mở rộng TextView, vậy tại sao điều này sẽ tạo ra sự khác biệt?
Shirane85
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.