在 TabLayout 中是否有 any-way 使用 SpannableString?

is there any-way to use SpannableString in TabLayout?

我想用两种不同的文字大小设置 TabLayout 的标题。就像下面给定的图像。或者反之亦然!

我已经尝试使用 SpannableString,如下所示。此代码段在 for 循环中直到 5!

SpannableString mSpannableString=  new SpannableString(s);
mSpannableString.setSpan(new RelativeSizeSpan(2f), 0,5, 0); // set size
mSpannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);// set color
mTabLayout.getTabAt(i).setText(mSpannableString);

但是正如 CommonaSware 所说 setText() 并没有采用丰富的内容!

TabLayoutTextView 的默认样式使用 TextAppearancetextAllCaps 属性设置为 true。此转换方法将 CharSequence 处理为平面 String,因此任何 Spannable 信息都将丢失。

为了防止这种情况,我们可以为 TabLayout 创建一个样式来禁用 textAllCaps。例如:

<style name="TabTextAppearance" parent="TextAppearance.Design.Tab">
    <item name="textAllCaps">false</item>
</style>

将此设置为 TabLayout 上的 tabTextAppearance 将允许您的 SpannableString 按预期工作。

<android.support.design.widget.TabLayout
    android:id="@+id/tab_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabTextAppearance="@style/TabTextAppearance" />

如评论中所述,为选项卡使用自定义 View 是这里的另一种选择,因为默认情况下不会有有问题的属性设置。

Mike M. 回答的补充

我遇到了同样的问题,但只是在 Lollipop 和 backwards 中,在 Oreo 中它在设置样式之前工作得很好,幸运的是 Mike 的回答解决了它。

我正在使用 Google Material TabLayout:

<com.google.android.material.tabs.TabLayout
        android:id="@+id/tabs"
        app:tabTextAppearance="@style/TabTextAppearance"
        android:background="@color/colorDarkGreen"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:tabMaxWidth="0dp"
        app:tabGravity="fill"
        app:tabMode="fixed"
        app:tabBackground="@drawable/tab_color_selector_green">

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

至少,如果您正在为 Oreo 等工作,则​​无需使用此小部件来设置样式。

另一种方法是使用SpannableString文本到TabLayout:

@Override
    public CharSequence getPageTitle(int position) {
        // Generate title based on item position
        SpannableString sb = new SpannableString( tabTitles[position]);
        sb.setSpan(new RelativeSizeSpan(2f), 0,5, 0); // set size
        sb.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);// set color

        return sb;
    }

更多信息请查看Add Icons+Text to TabLayout