TabLayout设计支持中android:textAllCaps="false"无效

114
我在 android.support.design.widget.TabLayout 中设置了 android:textAllCaps="false" ,但标签标题仍然以全大写字母显示。
如何取消全大写字母?

我认为你必须以继承TabLayout的基本样式的特定样式来定义它。 - Vannen
@Vannen可以给我展示一些解决这个问题的代码吗? - Dhrumil Shah - dhuma1981
请使用以下代码:editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()}); - Dhiren Hamal
18个回答

221

设计库23.2.0+的更新

原来的答案在使用23.2.0或更高版本的设计库时不起作用。感谢@fahmad6在评论中指出,以防有人错过了那个评论,我会把它放在这里。你需要将textAllCapsandroid:textAllCaps都设置为false来禁用所有的大写设置。

<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
      <item name="textAllCaps">false</item>
      <item name="android:textAllCaps">false</item>
</style>
默认情况下,TabLayout创建选项卡时会将textAllCaps属性设置为true,你需要定义一个样式来将该标志设置为false。
<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
      <item name="tabTextAppearance">@style/MyCustomTextAppearance</item>
</style>

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

5
你的答案看起来正确,但我不知道为什么对我没用。 - Moinkhan
7
它正在运作。使用这种方式 style="@style/MyCustomTabLayout" - Dhrumil Shah - dhuma1981
2
这里重要的部分是答案使用了 textAllCaps,而问题使用了 android:textAllCaps - Fabian Frank
3
有趣的是,由于我无法解释的原因,我必须明确地添加 android:textAllCapstextAllCaps 并将它们都设置为false,才能使我的文本按预期显示(即显示 "Local" 而不是 "LOCAL")。仅尝试其中一个并不能达到效果。 - fawaad
5
更新:应该使用以下方式来引用:app:tabTextAppearance="@style/MyCustomTextAppearance",这样就可以正常工作了。 - Vidhi Dave
显示剩余7条评论

93

@Paresh Mayani的回答是正确的,但是您只能创建选项卡样式

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

并使用它

<android.support.design.widget.TabLayout
    app:tabTextAppearance="@style/MyCustomTextAppearance"
    .../>

2
@Muhammad Umair Shafique的解决方案可行。我们必须使用'app:tabTextAppearance'属性而不是'style'属性。 - thilina Kj
1
这个答案似乎比被接受的答案更好,因为只创建了1种样式。 - Cheok Yan Cheng

47

使用此属性 app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget",它会起作用。

  <android.support.design.widget.TabLayout
    android:id="@+id/tablayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    app:tabGravity="fill"
    app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
    app:tabIndicatorColor="@color/colorPrimary"
    app:tabMode="fixed"
    app:tabPaddingStart="0dp" />

1
仅在视图元素内提供纯XML答案 - 无需为此添加外部样式或在Java中进行任何操作。太好了 - 谢谢。 - Gene Bo
真的吗,因为这个人擅长复制和粘贴?问题已经在本帖子中的一个答案中得到了回答,并且该答案给予了所有者信用,而这个答案则冒充所有者。这是刚才那个答案的链接:https://dev59.com/6l0Z5IYBdhLWcg3wlBFU#36191045 - Farid
我看不到这个答案 @Farid - yousef

42

2
确认一下,这个回答是我在这个页面上找到的唯一解决我的问题的答案。我的项目中minSdkVersion=16,targetSdkVersion=26,Design库版本为26.0.0-alpha1,我正在使用android.support.design.widget.TabLayout - Tom Ladek
1
无法在 com.google.android.material.tabs.TabLayout 上工作。 - Farid

16

在我的情况下,有两种变体可行:

1)由Bogdan(susemi99)提供:

<android.support.design.widget.TabLayout
    app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
/>

2)由Paresh Mayani提供。我想要同时使用android:textAllCaps="false"和android:textSize="15sp",所以他的旧方法适用。

在styles.xml中编写以下内容(parent可能会有所不同,例如"@android:style/TextAppearance.Widget.TabWidget"、"TextAppearance.Design.Tab"):

<style name="TabLayout" parent="Widget.Design.TabLayout">
    <item name="tabIndicatorColor">@color/color_blue</item>
    <item name="tabSelectedTextColor">@color/color_blue</item>
    <item name="tabTextColor">@color/black</item>
    <item name="tabTextAppearance">@style/TabLayoutTextAppearance</item>
</style>

<style name="TabLayoutTextAppearance" parent="TextAppearance.Design.Tab">
    <item name="android:textSize">15sp</item>
    <item name="textAllCaps">false</item>
    <item name="android:textAllCaps">false</item>
</style>

应用这个样式到布局中:

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

14

对于那些其他答案无法解决问题的人。

当您有单行标签文本时,定义样式是有效的。如果您仔细查看TabLayout,您会发现它在选项卡有多行时使用一个名为design_tab_text_size_2line的字段。

我找到的唯一影响此字段的方法是在dimen文件中重写它。

因此,请将以下内容放入您的values / dimens.xml中

<dimen name="design_tab_text_size_2line" tools:override="true">10sp</dimen>

希望这有所帮助。


1
谢谢,这个可行!只是我注意到一个小问题 - 当你将值传递为@dimen/10sp时,会显示编译错误。你应该只传递所需的sp而不带“@dimen /”前缀(例如10sp)。 - Slavi Petrov
谢谢你的提示 :) - Evren Ozturk
2
不错的发现 @EvrenOzturk。给你点赞。 - ralphgabb
太棒了,发现了!!! - coderBox

7

这个对我来说只需要一行就可以完成

 <android.support.design.widget.TabLayout
    app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"/>

5

这里有一个简单的解决方案……请享用

 for (int tabIndex = 0; tabIndex <tabLayout.getTabCount() ; tabIndex++) {
        TextView tabTextView = (TextView)(((LinearLayout)((LinearLayout)tabLayout.getChildAt(0)).getChildAt(tabIndex)).getChildAt(1));
        tabTextView.setAllCaps(false);
    }

你现在对 Tab 的布局做了很多假设。如果库中的这种布局发生了变化,你的代码可能会出现崩溃。例如,LinearLayout 可能会被改为其他布局方式,或者子元素的顺序可能会改变。 - Dimezis

3

尝试以下方法,您可以在 TabLayout 中实现所有 TextView 的方法。

private void setCustomTab() {

    ViewGroup vg = (ViewGroup) mTabLayout.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(ResourcesCompat.getFont(this,R.font.montserrat_medium));
                ((TextView) tabViewChild).setAllCaps(false);
            }
        }
    }
}

希望它有所帮助。

3

更改为: <item name="textAllCaps">false</item>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接