android: textAllCaps = "false" funktioniert nicht für die TabLayout-Designunterstützung

77

Ich habe android:textAllCaps="false"in meinem android.support.design.widget.TabLayoutGedanken festgelegt, dass der Tab-Titel nur in Großbuchstaben angezeigt wird.

Wie kann ich alle Kappen entfernen?

dhuma1981
quelle
Ich glaube, Sie müssen das in einem bestimmten Stil definieren, der den Basisstil für ein TabLayout erbt.
Vannen
@Vannen kann mir bitte einen Code zeigen, der dieses Problem löst?
Dhuma1981
Bitte verwenden Sie editText.setFilters (neuer InputFilter [] {neuer InputFilter.AllCaps ()});
Dhiren Hamal

Antworten:

176

UPDATE FÜR DESIGN LIBRARY 23.2.0+

Die ursprüngliche Antwort funktioniert nicht mit der Designbibliothek 23.2.0 oder höher. Vielen Dank für @ fahmad6, auf das im Kommentar hingewiesen wurde. Falls jemand diesen Kommentar verpasst hat, werde ich ihn hier einfügen. Sie müssen beide setzen textAllCapsund android:textAllCapsauf falsealle Einstellungen nutzen zu deaktivieren.

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

URSPRÜNGLICHE ANTWORT

Standardmäßig werden Registerkarten von TabLayout erstellt. Die Eigenschaft textAllCaps wird auf true gesetzt. Sie müssen einen Stil definieren, der dieses Flag auf false setzt.

<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>
Paresh Mayani
quelle
4
Ihre Antwort sieht richtig aus, aber ich weiß nicht warum, es hat bei mir nicht funktioniert
Moinkhan
7
@ Moinkhan Es funktioniert. Verwenden Sie diese Methode style = "@ style / MyCustomTabLayout"
dhuma1981
2
Der wichtige Teil hier ist, dass die Antwort verwendet wird, textAllCapswährend die Frage verwendet wird android:textAllCaps.
Fabian Frank
1
Diese Lösung funktioniert nicht mehr mit appCompat 23.2.0. Es wotking mit:android:textAllCaps
mtrakal
3
Interessanterweise musste ich aus Gründen, die ich nicht erklären kann, beide explizit hinzufügen android:textAllCapsund textAllCapsauf false setzen, damit mein Text wie gewünscht angezeigt wird (dh "Lokal" anstelle von "LOKAL"). Entweder alleine zu versuchen, hat den Trick nicht getan.
Fawaad
77

Die Antwort von @Paresh Mayani ist korrekt, Sie können jedoch nur einen Tabulatorstil erstellen

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

Und benutze es mit

<android.support.design.widget.TabLayout
    app:tabTextAppearance="@style/MyCustomTextAppearance"
    .../>
Ordon
quelle
@ Muhammad Umair Shafiques Lösung funktioniert. Wir müssen 'app: tabTextAppearance' atrribute anstelle des Attributs 'style' verwenden.
Thilina Kj
1
Dies scheint eine bessere Antwort zu sein als die akzeptierte Antwort, da nur 1 Stil erstellt wird.
Cheok Yan Cheng
35

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

<android.support.design.widget.TabLayout
    app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
/>
Changhoon
quelle
2
Bestätigen Sie, keine andere Antwort mit mehr Up-Votes auf dieser Seite hat den Trick für mich getan als diese. Mein Projekt hat minSdkVersion = 16, targetSdkVersion = 26, Design Library Version 26.0.0-alpha1 und ich verwende die android.support.design.widget.TabLayout.
Tom Ladek
Nicht arbeiten fürcom.google.android.material.tabs.TabLayout
Farid
33

Verwenden Sie dieses Attribut. app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget" Es wird funktionieren.

  <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" />
yousef
quelle
1
Beantworten Sie hier nur die reine XML-Datei innerhalb des Ansichtselements - Sie müssen hierfür keinen externen Stil hinzufügen oder etwas in Java tun. Schön - danke
Gene Bo
Oh, wirklich, weil dieser Typ gut in Copy & Past ist?! Die Frage wird mit der gleichen Lösung beantwortet, nur eine Antwort oben in diesem Thread, und diese Antwort gibt dem Eigentümer eine Gutschrift, während sich diese als Eigentümer ausgibt. Hier ist die Antwort direkt über diesem einen stackoverflow.com/a/36191045/5636313
Farid
Ich kann diese Antwort nicht sehen @Farid
yousef
10

In meinem Fall funktionieren zwei Varianten:

1) Von Bogdan (susemi99):

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

2) Von Paresh Mayani. Ich wollte android:textAllCaps="false"und android:textSize="15sp"gleichzeitig, so funktioniert seine alte Methode.

Beim styles.xmlSchreiben (Eltern können variieren, z. B. "@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>

Wenden Sie diesen Stil im Layout an:

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

Für diejenigen , die keine anderen Antworten finden können .

Das Definieren eines Stils funktioniert einwandfrei, wenn Sie einzeiligen Tabulatortext haben. Wenn Sie sich das TabLayout genauer ansehen, werden Sie feststellen, dass es ein Feld design_tab_text_size_2line verwendet, wenn die Registerkarten mehr als eine Zeile enthalten.

Die einzige Möglichkeit, dieses Feld zu beeinflussen, besteht darin, es in Ihrer Dimen-Datei zu überschreiben.

Fügen Sie dies also in Ihre Werte / dimensions.xml ein

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

Ich hoffe es hilft.

Evren Ozturk
quelle
1
Danke, das funktioniert! Nur eine kleine Sache, die mir aufgefallen ist - wenn Sie den Wert als @ dimen / 10sp übergeben, wird ein Kompilierungsfehler angezeigt. Sie sollten nur das benötigte sp ohne das Präfix "@ dimen /" übergeben (zum Beispiel 10sp).
Slavi Petrov
Danke für den Tipp :)
Evren Ozturk
2
Guter Fund @EvrenOzturk. Daumen hoch für dich.
Ralphgabb
4

Hier ist eine einfache Lösung ... Viel Spaß

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

In Versionen vor 14 müssen Sie Folgendes festlegen (wie von Paresh Mayani kommentiert):

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

Aber wenn die Android-Version gleich oder größer als 14 ist, müssen Sie Folgendes einstellen:

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

Wenn Sie also mit Versionen vor und nach 14 kompatibel sein müssen, müssen Sie auch einen Ordner values-v14 und eine Datei styles.xml in diesem Ordner mit dem folgenden Inhalt erstellen:

<?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>
Pedro Leite
quelle
1

Versuchen Sie die folgende Methode und Sie können alle Methoden von TextViewin implementierenTabLayout

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

Ich hoffe es hilft.

Pankaj Lilan
quelle
1

Veränderung: <item name="android:textAllCaps">false</item>

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

Fidan Bacaj
quelle
1

Das hat bei mir funktioniert ...

<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>
Rahul
quelle
0

Sie können dies auch in Ihrem Java-Code tun. Wenn Sie ein SlidingTabLayout verwenden, sehen Sie sich dieses Beispiel an:

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

Beachten Sie, dass textView.setAllCaps () als Perimeter true hat :

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

Als ich dies in (falsch) änderte, löste es das Problem für mich:

textView.setAllCaps(false);

Auch meine String-Ressourcendatei, die ich für die Registerkarten verwende, sieht folgendermaßen aus:

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

Wenn es jedoch alle Großbuchstaben wie> TITEL MIT ALLEN GROSSBUCHSTABEN <hätte, würden Sie natürlich immer noch alle Großbuchstaben in Ihren Registerkarten haben.

Ich habe keine weiteren Änderungen vorgenommen.

Es ist bemerkenswert, dass Sie auch textView.setAllCaps (false) festlegen können, aber dies hat in meinem Fall keinen Unterschied gemacht. Ich habe gerade textView.setAllCaps (true) auskommentiert.

DroidCrafter
quelle
0

Fügen Sie dies einfach Ihrer benutzerdefinierten Stildatei hinzu

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

Ich habe alle oben genannten Lösungen gelesen und alle führen dazu.

Nandagiri Akhilesh
quelle