在 Tablayout 视图中更改字体

Change font in Tablayout view

我想更改选项卡上的字体系列,具体取决于选择的选项卡。我想为选定的选项卡设置粗体,为未选定的选项卡设置浅色字体 我的包里有这个字体 /font

您只能通过编程方式更改 selected/unselected 选项卡的字体系列。您可以使用 TabLayout.OnTabSelectedListeneronTabSelected(TabLayout.Tab tab) 回调来收听选择和取消选择哪个选项卡,您可以更改所选标签的字体和在 onTabUnselected(TabLayout.Tab 标签) 回调中,您可以更改未选中标签(上一个所选标签)的字体。

这可以通过如下代码实现:

tabLayout = findViewById(R.id.tabLayout);

//initial selected Tab
TabLayout.Tab selectedTab = tabLayout.getTabAt(0);
setTabTypeface(selectedTab, ResourcesCompat.getFont(this, R.font.roboto_mono));

//add OnTabSelectedListener
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
   @Override
   public void onTabSelected(TabLayout.Tab tab) {
      setTabTypeface(tab, ResourcesCompat.getFont(tab.view.getContext(), R.font.roboto_mono));
   }

   @Override
   public void onTabUnselected(TabLayout.Tab tab) {
      setTabTypeface(tab, ResourcesCompat.getFont(tab.view.getContext(), R.font.extra_light_italic));
  }

  @Override
  public void onTabReselected(TabLayout.Tab tab) {
  }
});

使用辅助函数 setTabTypeface(TabLayout.Tab tab, Typeface typeface) 来更改 Tab 的字体,如下所示:

private void setTabTypeface(TabLayout.Tab tab, Typeface typeface){

        for(int i=0; i<tab.view.getChildCount(); i++)
        {
            View tabViewChild = tab.view.getChildAt(i);
            if (tabViewChild instanceof TextView)
                ((TextView) tabViewChild).setTypeface(typeface);
        }
    }

当然,您必须为所有选项卡设置 initial/default 状态(未选择的字体系列),这可以在 xml 中使用 app:tabTextAppearance TabLayout 的属性,如下例所示:

<com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:tabTextAppearance="@style/MyCustomTextAppearance"
        app:tabGravity="fill"
        app:tabIndicatorColor="@android:color/holo_orange_light"
        app:tabSelectedTextColor="@android:color/holo_red_dark"
        app:tabTextColor="@android:color/holo_blue_dark" >

        <com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tab 1" />

        <com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tab 2" />

        <com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tab 3" />

    </com.google.android.material.tabs.TabLayout>

其中 @style/MyCustomTextAppearance 是您自定义的所有标签的初始 TextAppearance 样式,如下所示:

<style name="MyCustomTextAppearance" parent="@android:style/TextAppearance.Widget.TabWidget">
    <item name="android:textSize">16sp</item>
    <item name="android:textAllCaps">true</item>
    <item name="fontFamily">@font/extra_light_italic</item>
    <item name="android:fontFamily">@font/extra_light_italic</item>
</style>

要同时更改 selected/unselected 选项卡的文本颜色,您可以使用 xml 属性 app:tabSelectedTextColorapp: TabLayout 的 tabTextColor

以上示例的结果如下所示。我为选定的选项卡设置了 Roboto Mono 字体,为从 Font 文件夹中检索到的未选定的选项卡设置了 Extra Light Italic 字体。