改变androiddevise支持TabLayout中的标签文本的字体

我正在尝试从androiddevise库的新的TabLayout工作。

我想要改变标签文本为自定义字体 。 而且,我试图search一些与TabLayout相关的TabLayout ,但是最后却是这样 。

请指导我如何更改标签文本字体。

像这样从Java代码或XML创build一个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" /> 

请确保保持id在这里,因为如果您使用自定义textview TabLayout检查此ID

然后从代码充气此布局,并在该文本视图上设置自定义的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); } 

如果你正在使用TabLayout,你想改变字体,你必须添加一个新的for循环到以前的解决scheme,像这样:

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

请参阅使用Sherlock更改操作栏选项卡中的字体样式

来自Praveen Sharma的很好的回答。 只是一个小的补充:而不是在任何地方使用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是一个带有TextViewLinearLayout (它也可以select包含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是添加自定义视图。 这是一个很好的例子 。

以下方法将recursion地在整个ViewGroup更改字体。 我select这个方法是因为你不必关心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); } } } 

对于devise支持23.2.0,使用setupWithViewPager,您必须将代码从addTab(Tab选项卡)移动到addTab(Tab选项卡,布尔setSelected)。

那么,我发现它在23.4.0简单,而不使用循环。 只需覆盖@ejwbuild议的addTab(@NonNull Tab tab,boolean setSelected)。

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

希望它可以帮助:)

我的Resovle方法就像这样,改变指定的标签文本,

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

正如Andrei所回答的,你可以通过扩展TabLayout类来改变字体 。 正如Penzzz所说,你不能在addTab方法中做到这一点 。 重写onLayout方法如下:

 @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方法,因为在使用setupWithViewPager方法将TabLayout与ViewPager绑定时,必须在setText方法中或在PagerAdapter中设置选项卡文本,然后在发生这种情况时,在父ViewGroup上调用onLayout方法( TabLayout),这是放置设置fontface的地方(更改TextView文本导致调用它的父级的onLayout方法 – 一个tabView有两个孩子,一个是ImageView另一个是TextView)

创build自己的自定义样式,并使用父类风格为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" /> 

你可以使用这个,它适用于我。

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

更改

if (tabViewChild instanceof TextView) {

对于

 if (tabViewChild instanceof AppCompatTextView) { 

使其与android.support.design.widget.TabLayout(至less从com.android.support:design:23.2.0)