android: textAllCaps = “false” не працює для підтримки дизайну TabLayout


79

У android:textAllCaps="false"своїй android.support.design.widget.TabLayoutдумці я встановив, що заголовок вкладки відображається лише у всіх великих колонтитулах.

Як я можу зняти всі кришки?


Я вважаю, що ви повинні визначити це у певному стилі, який успадковує базовий стиль для TabLayout.
Ваннен

@Vannen може, будь ласка, показати мені якийсь код, який вирішує цю проблему?
dhuma1981

будь ласка, використовуйте editText.setFilters (new InputFilter [] {new InputFilter.AllCaps ()});
Dhiren Hamal 02

Відповіді:


177

ОНОВЛЕННЯ ДИЗАЙН-БІБЛІОТЕКИ 23.2.0+

Оригінальна відповідь не працює з бібліотекою дизайну 23.2.0 або пізнішої версії. Дякую за те, що @ fahmad6 зазначив у коментарі. Якщо хтось пропустить цей коментар, я поміщу його тут Вам потрібно встановити як textAllCapsі android:textAllCapsдля falseвідключення всіх капіталізувати настройки.

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

ОРИГІНАЛЬНА ВІДПОВІДЬ

За замовчуванням вкладки створюються TabLayout, встановлює властивість textAllCaps істинним, вам потрібно визначити стиль, що робить цей прапор хибним.

<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, щоб мій текст відображався за бажанням (тобто "Місцевий" замість "LOCAL"). Спроба будь-якої самості не зробила трюку.
fawaad

77

Відповідь @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
Здається, це краща відповідь, ніж прийнята відповідь, оскільки створено лише 1 стиль.
Cheok Yan Cheng

36

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
Тут дайте відповідь лише на те, що це чистий xml всередині елемента view - немає необхідності додавати зовнішній стиль для цього або робити щось на Java. Приємно - спасибі
Gene Bo

О справді, тому що цей хлопець добре володіє копіями та минулими ?! На запитання відповідає одне і те ж рішення, лише одна відповідь вище в цій темі, і ця відповідь надає довіру власнику, в той час як він позначається як власник. Ось відповідь трохи вище цього одного stackoverflow.com/a/36191045/5636313
Farid

я не можу бачити цю відповідь @Farid
Юсеф

11

У моєму випадку працюють два варіанти:

1) Богдан (susemi99):

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

2) Автор Пареш Маяні. Я хотів мати android:textAllCaps="false"і android:textSize="15sp"одночасно, тому його старий метод працює.

У styles.xmlзаписі (батьківський може змінюватися, наприклад, "@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"
    />

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).
Славі Петров

Thx за підказку :)
Еврен Озтюрк

2
Гарна знахідка @EvrenOzturk. Великі пальці для вас.
ralphgabb

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

У версіях priror до 14 вам потрібно встановити (як прокоментував Пареш Маяні):

<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, вам також потрібно створити значення папки-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

Спробуйте наступний метод, і ви можете реалізувати всі методи TextViewвTabLayout

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

Це спрацювало для мене ...

<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 (правда).


0

Просто додайте це до власного файлу стилю

<item name="android:textStyle">normal</item>

Я прочитав усі вищезазначені рішення і всі ведуть до цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.