Intereting Posts

Изменение шрифта текста табуляции в поддержку дизайна Android. TabLayout

Я пытаюсь работать над новым TabLayout из библиотеки дизайна Android.

Я хочу изменить текст вкладки на пользовательский шрифт . И я попытался найти какой-то стиль, связанный с TabLayout , но до этого TabLayout .

Прочтите, как изменить шрифты на вкладке.

Solutions Collecting From Web of "Изменение шрифта текста табуляции в поддержку дизайна Android. TabLayout"

Создайте TextView из Java-кода или XML, как это

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

Обязательно сохраните идентификатор, как он есть здесь, потому что TabLayout проверяет этот идентификатор, если вы используете пользовательский текстовый просмотр

Затем из кода раздуйте этот макет и установите пользовательский 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 в предыдущее решение следующим образом:

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

См. Это Изменение стиля шрифта в закладках панели действий с помощью Шерлока

Отличный ответ от прайвена Шармы. Просто небольшое дополнение: вместо использования 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 – это добавить к нему пользовательский вид. Вот отличный пример .

Следующий метод изменяет шрифт во всей 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); } } } 

Для поддержки дизайна 23.2.0, используя setupWithViewPager, вам придется переместить код из addTab (вкладка Tab) в addTab (вкладка Tab, boolean setSelected).

Ну, я нашел это простым в 23.4.0 без использования цикла. Просто переопределите addTab (вкладка @NonNull Tab, boolean setSelected), как было предложено @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); } 

И вот 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, как это, измените текст вкладки Specified,

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

Как ответил Андрей , вы можете изменить шрифт, расширив класс TabLayout . И как сказал Пенззз , вы не можете сделать это в методе 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, а когда это произошло, метод onLayout вызывается в родительской ViewGroup ( TabLayout), и это место для установки шрифта. (Изменение текста TextView вызывает вызов метода onLayout его родительского элемента. В tabView есть двое детей, один из которых – ImageView другой – TextView)

Создайте свой собственный стиль и используйте родительский стиль как 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" /> 

+ Изменить

if (tabViewChild instanceof TextView) {

для

 if (tabViewChild instanceof AppCompatTextView) { 

Чтобы он работал с android.support.design.widget.TabLayout (по крайней мере, от com.android.support:design:23.2.0)

Вы можете использовать это, это работает для меня.

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