android:textAllCaps =“ false”不适用于TabLayout设计支持


76

我已android:textAllCaps="false"在我的android.support.design.widget.TabLayout想法是分别表示只有全部大写选项卡标题。

如何移除所有盖子?


我相信您必须以一种特定的样式进行定义,该样式会继承TabLayout的基本样式。
Vannen

@Vannen可以告诉我一些解决此问题的代码吗?
dhuma1981年

请使用editText.setFilters(new InputFilter [] {new InputFilter.AllCaps()});
Dhiren Hamal

Answers:


173

设计库更新23.2.0+

原始答案不适用于设计库23.2.0或更高版本。感谢@ fahmad6在评论中指出,以防万一有人错过了该评论,我将其放在此处。您需要同时设置textAllCapsandroid:textAllCapsfalse禁用所有资本设置。

<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>

4
您的答案看起来正确,但我不知道为什么,这对我
不起作用

7
@Moinkhan它正在工作。使用这种方式style =“ @ style / MyCustomTabLayout”
dhuma1981

2
这里的重要部分是答案正在使用,textAllCaps而问题正在使用android:textAllCaps
法比安·弗兰克

1
此解决方案停止与appCompat 23.2.0一起使用。android:textAllCaps
令人兴奋

3
有趣的是,由于我无法解释的原因,我不得不显式地添加两者 android:textAllCaps并将textAllCaps它们设置为false,以使我的文本按需要显示(即“本地”而不是“本地”)。单独尝试任何一个都不行。
fawaad '16

76

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

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

并使用它

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

@Muhammad Umair Shafique的解决方案正在运行。我们必须使用“ app:tabTextAppearance”属性而不是“ style”属性。
thilina Kj

1
这似乎比接受的答案更好,因为仅创建了一种样式。
Cheok Yan Cheng

35

https://stackoverflow.com/a/34678235/1025379

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

2
确认,此页面上没有其他获得更多投票支持的答案对我有用。我的项目的minSdkVersion = 16,targetSdkVersion = 26,设计库版本26.0.0-alpha1,我正在使用android.support.design.widget.TabLayout
汤姆·拉德克

不工作com.google.android.material.tabs.TabLayout
Farid

33

使用此属性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
在这里只回答在view元素内部全部是纯xml-无需为此添加外部样式或在Java中执行任何操作。尼斯-感谢
基因博

真的,因为这个家伙擅长复制和粘贴?在该线程中,上面的一个答案是用相同的解决方案来回答问题的,而这个答案是所有者,而这个答案则归功于所有者。这就是上面的答案stackoverflow.com/a/36191045/5636313
Farid

我看不到这个答案@Farid
yousef

9

对于那些无法得到其他答案的人

当您具有单行制表符文本时,定义样式可以很好地工作。如果你仔细看进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 '18

9

就我而言,有两种变体可以工作:

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写入(母体可能会发生变化,例如, “@android:风格/ 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"
    />

4

这是简单的解决方案。...享受

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

2

在版本14之前的版本中,您需要进行设置(如Paresh Mayani所评论):

<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>

但是,如果android版本等于或大于14,则需要设置:

<item name="android:textAllCaps">false</item>

因此,如果需要与14之前和之后的版本兼容,则需要创建一个文件夹values-v14,并在该文件夹中创建一个包含以下内容的styles.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
    <style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
      <item name="android:textAllCaps">false</item>
    </style>
</resources>

1

试试下面的方法,你可以实现的所有方法TextViewTabLayout

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);
            }
        }
    }
}

希望能帮助到你。


1

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

带有: <item name="textAllCaps">false</item>


1

这对我有用...

<style name="TabLayoutStyle" parent="Widget.Design.TabLayout">
    <item name="tabTextAppearance">@style/TabTextAppearance</item>
</style>

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

0

您也可以在Java代码中执行此操作。如果您使用的是SlidingTabLayout,请查看以下示例:

protected TextView createDefaultTabView(Context context){
        TextView textView = new TextView(context);
        textView.setGravity(Gravity.CENTER);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);//see line 38 above change the value their in TAB_VIEW_TEXT_SIZE_SP.
        textView.setTypeface(Typeface.DEFAULT);//From DEFAULT_BOLD
        textView.setTextColor(Color.parseColor("#536DFE"));//Text color of the words in the tabs. Indigo A200

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
            // If we're running on Honeycomb or newer, then we can use the Theme's
        // selectableItemBackground to ensure that the View has a pressed state
            TypedValue outValue = new TypedValue();
            getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
            textView.setBackgroundResource(outValue.resourceId);
        }

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
            // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style
            textView.setAllCaps(true);
        }

        int padding = (int)(TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
        textView.setPadding(padding, padding, padding, padding);

        return textView;
    }

请注意,textView.setAllCaps()的周长为true

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
            // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style
            textView.setAllCaps(true);
        }

当我将其更改为(false)时,它为我解决了问题:

textView.setAllCaps(false);

另外,我用于选项卡的字符串资源文件如下所示:

<string name="tab_title">Title with capital and smaller case</string>

但是,如果所有大写字母都>> TITLE WITH ALL CAPS <,您当然仍然会在选项卡中获得所有大写字母。

我没有做其他更改。

值得注意的是,您也可以设置textView.setAllCaps(false),但这对我来说没有什么区别。我只是注释掉了textView.setAllCaps(true)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.