在 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() 并没有采用丰富的内容!
TabLayout
的 TextView
的默认样式使用 TextAppearance
,textAllCaps
属性设置为 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
我想用两种不同的文字大小设置 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() 并没有采用丰富的内容!
TabLayout
的 TextView
的默认样式使用 TextAppearance
,textAllCaps
属性设置为 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