改变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
是一个带有TextView
的LinearLayout
(它也可以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)