【问题标题】:is there any-way to use SpannableString in TabLayout?有什么方法可以在 TabLayout 中使用 SpannableString?
【发布时间】:2019-12-03 15:02:18
【问题描述】:

我想用两种不同的文字大小设置 TabLayout 的标题。就像下面给定的图像。或者反过来实现这一目标!

我已尝试使用 SpannableString,如下所示。这个 sn-p 在 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() 并没有获取丰富的内容!

【问题讨论】:

  • 也许你可以使用 fromHtml()
  • 使用 Html.fromHtml() 或者如果它不起作用,则为选项卡创建自定义布局。
  • @SahilMunjal Html.fromHtml() 这个也不行!
  • 那么你应该为标签使用自定义布局..
  • setText()TabLayout.Tab 上采用CharSequence。如果通过SpannableString 的丰富格式不起作用,那感觉就像TabLayout 中的一个错误。请编辑您的问题并提供minimal reproducible example,以展示您如何尝试设置选项卡的文本。

标签: android android-tablayout text-size


【解决方案1】:

TabLayoutTextViews 的默认样式使用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" />

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

【讨论】:

    【解决方案2】:

    另一种方法是使用 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

    【讨论】:

      【解决方案3】:

      Mike M.'s Answer 的补充

      我遇到了同样的问题,但只在 Lollipop 和 backs 中,在 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 工作,则不需要使用此小部件设置样式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        相关资源
        最近更新 更多