Warum wird mein Button-Text auf Lollipop auf ALL CAPS gesetzt?


447

In meiner App "Tide Now WA", die ich kürzlich mit dem neuen Nexus 9-Tablet (Lollipop - API 21) auf Kompatibilität getestet habe.

Es schreibt einen Schaltflächentext. Diese App schreibt den Text korrekt mit Android 2.3 und Android 4.0. Dh gemischte Groß- und Kleinbuchstaben.

Wenn dieselbe App auf meinem Nexus 9 ausgeführt wird, werden alle Buchstaben im Text großgeschrieben.

FWIW mein Manifest enthält die folgende Aussage:

uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14"

Kann ich das in meinem Code beheben oder ist es ein Fehler im Betriebssystem, danke


Können Sie einen Code teilen, wie Sie Groß- und Kleinbuchstaben gemischt haben
N Sharma

Sie sind in meiner Datei strings.xml definiert, z. B. <string name = "r1s1"> Seattle </ string>
user1644002

Ja. 21. zu früh, um richtig zu tippen. Entschuldigung
user1644002

23
Der Schaltflächentext ist bei Verwendung des Themas Material (oder DeviceDefault mit API 21+) standardmäßig vollständig begrenzt. Dies funktioniert wie beabsichtigt.
Alanv

Antworten:


636

Ich habe keine Ahnung, warum es passiert, aber es gibt 3 triviale Versuche:

  1. Verwenden Sie android:textAllCaps="false"in Ihremlayout-v21

  2. Ändern Sie programmgesteuert die Transformationsmethode der Schaltfläche. mButton.setTransformationMethod(null);

  3. Überprüfen Sie Ihren Stil für Allcaps

Hinweis : public void setAllCaps(boolean allCaps), android:textAllCapssind verfügbar von API - Version 14.


# 1 machte keinen Unterschied. Sie sind sich nicht sicher, wie Sie # 3 machen sollen, haben keine Stile? Versuchen Sie jetzt # 2.
user1644002

2
Ja, dies wird hinzugefügt: btn [i] .setTransformationMethod (null); macht es funktioniert danke
user1644002

2
Ich akzeptiere Nikolas Antwort als Lösung, möchte aber darauf hinweisen, dass der andere Teil der Fragen der von Alanv ist, der das Warum in den obigen Kommentaren erklärt hat.
user1644002

1
Hat auch für mich funktioniert und die programmatische Methode verwendet, da textAllCaps XML attr nur API> 14 unterstützt. Danke!
Patrickjason91

3
Ich habe <item name="android:textAllCaps">false</item>in meiner Stildefinition
Jemand irgendwo

169

Folgendes habe ich in meiner Datei values ​​/ theme.xml getan

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="buttonStyle">@style/MyButton</item>
    </style>

    <style name="MyButton" parent="Widget.AppCompat.Button">
        <item name="android:textAllCaps">false</item>
    </style>

8
Für die Unterstützung von Pre-API Level 14 können Sie verwenden <item name="textAllCaps">false</item>.
CommonsWare

Dies gilt nur für Widget.AppCompat.Button. Die allgemeinere Antwort gibt Ashish Chaugule unten, dh das direkte Hinzufügen von <item name = "android: textAllCaps"> false </ item> zum Themenstil. (Obwohl die Fragen ursprünglich speziell für Schaltflächen gestellt wurden, denke ich, wenn allCaps nicht für Schaltflächen gewünscht wird, wird es auch nicht für
Menüelemente

1
Hat bei mir nicht funktioniert. Wurde zur Arbeit, als ich buttonStylezuandroid:buttonStyle
Vasily Kabunov

2
In XML android:textAllCaps="false"(ich
benutze

107

Dies kann im Anwendungscode behoben werden, indem die Transformationsmethode der Schaltfläche festgelegt wird, z

mButton.setTransformationMethod(null);

Für Kotlin lautet die Syntax: mButton.transformationMethod = null
Native_Mobile_Arch_Dev

66

Setze android: textAllCaps = "false". Wenn Sie einen Appcompat-Stil verwenden, stellen Sie sicher, dass textAllCaps vor dem Stil steht. Andernfalls wird es vom Stil überschrieben. Zum Beispiel:

android:textAllCaps="false"
style="@style/Base.TextAppearance.AppCompat"

Arbeitete wie ein Zauber, aber in meinem Fall musste ich Folgendes tun: <style name = "textAppearanceButton" parent = "@ android: style / TextAppearance.Material.Widget.Button"> <item name = "android: textAllCaps"> false < / item> </ style>
Vfleitao

58

Fügen Sie diese Zeile mit Stil hinzu

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


52
Ich weiß nicht, warum sie dies zum Standard machen würden
Glenn Maynard

5
Dies ist die Standardeinstellung im Materialthema, da es der Art des Materialdesigns entspricht
QAMAR

arme Leute steckten in der quadratischen Schachtel des Materialdesigns fest
Eric

35

Dieser funktioniert ... nur in Ihrem Code in Ihrem unteren Code fügen Sie diesen hinzu:

android:textAllCaps="false"

Es sollte den Großbuchstaben deaktivieren, den U versucht, klein einzugeben.


32

Die Lollipop-Standardeinstellung enthält "textAllCaps true", sodass Sie sie manuell auf "false" setzen müssen


5
Das ist gut zu wissen. Gibt es eine Site, die alle diese Standardwerte pro Android-Version auflistet?
Adam


19

Es gibt eine einfachere Möglichkeit, die für alle Schaltflächen funktioniert. Ändern Sie einfach das Erscheinungsbild der Schaltflächen in Ihrem Thema. Versuchen Sie Folgendes:

in values-21 / styles.xml

<resources>
    <style name="myBaseTheme"
        parent="@android:style/Theme.Material.Light">
        <item name="android:colorPrimary">@color/bg</item>
        <item name="android:colorPrimaryDark">@color/bg_p</item>
        <item name="android:textAppearanceButton">@style/textAppearanceButton</item>
    </style>

    <style name="textAppearanceButton" parent="@android:style/TextAppearance.Material.Widget.Button">
        <item name="android:textAllCaps">false</item>
    </style>
</resources>

PS: Es wird empfohlen, die Prinzipien des Materialdesigns zu befolgen. Sie sollten großgeschriebenen Text in den Schaltflächen unter http://www.google.com/design/spec/components/buttons.html anzeigen


2
Ich stimme zu, es ist großartig, die Designrichtlinien zu befolgen ... bis der Schaltflächentext nicht mehr in die Schaltfläche passt
Jemand irgendwo

google sollte einfach aufhören, über stile zu reden - ich war mir nicht bewusst, dass auf den straßen ppl weinte und schluchzte wegen kleinbuchstaben!
Bharal

11

Wenn Sie den android.support.v7.widget.AppCompatButton im XML-Layout verwenden, können Sie vermeiden, dass Sie ein Layout-21 benötigen oder programmgesteuert etwas ändern müssen. Dies funktioniert natürlich auch mit der AppCompat v7-Bibliothek.

<android.support.v7.widget.AppCompatButton
    android:id="@+id/btnOpenMainDemo"
    android:textAllCaps="false"
    style="@style/HGButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_main_demo"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"/>

Hoffe das hilft.


11

Verwenden Sie diese Zeile android: textAllCaps = "false" in Ihrer XML

<Button
            android:id="@+id/btn_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/login_str"
            android:background="@color/colorBlue"
            android:textColor="@color/colorWhite"
            android:textAllCaps="false"
           />

9

In der Android Studio-IDE müssen Sie auf das Filtersymbol klicken, um die Experteneigenschaften anzuzeigen. Dann sehen Sie die textAllCapsImmobilie. Aktivieren Sie es und deaktivieren Sie es.


9

Sie können android:textAllCaps="false"der Schaltfläche hinzufügen .

Der Schaltflächentext wird möglicherweise durch das Thema Ihrer App, das für alle Schaltflächen gilt, in Großbuchstaben umgewandelt. Überprüfen Sie die Themen- / Stildateien, um das Attribut festzulegen android:textAllCaps.


9

Java:

yourButton.setAllCaps(false);

Kotlin:

yourButton.isAllCaps = false

XML:

android:textAllCaps="false"

Stile:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="buttonStyle">@style/yourButtonStyle</item>
    </style>

    <style name="yourButtonStyle" parent="Widget.AppCompat.Button">
        <item name="android:textAllCaps">false</item>
    </style>

Im Layout:

   <Button
      .
      .
      style="@style/yourButtonStyle"
      .
      .
   />

4

Wenn Sie hier angekommen sind, weil Ihr Facebook-Schaltflächentext in Großbuchstaben angezeigt wird, fügen android:textAllCaps="false"Sie ihn einfach in Ihre XML-Datei ein. Es hat bei mir funktioniert.


2

OK, bin gerade darauf gestoßen. Die Schaltflächen in Lollipop werden in Großbuchstaben angezeigt UND die Schriftart wird auf "Normal" zurückgesetzt. Aber in meinem Fall (Android 5.02) funktionierte es in einem Layout korrekt, aber nicht in einem anderen!?

Das Ändern von APIs hat nicht funktioniert.
Für die Einstellung auf alle Großbuchstaben ist min API 14 erforderlich, und die Schriftart wird weiterhin auf "normal" zurückgesetzt.

Dies liegt daran, dass die Android-Materialstile eine Änderung der Stile erzwingen, wenn keiner definiert ist (deshalb hat es in einem meiner Layouts funktioniert und nicht in dem anderen, weil ich einen Stil definiert habe).

Die einfache Lösung besteht also darin, im Manifest für jede Aktivität einen Stil zu definieren, der in meinem Fall nur:
android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen" war
( ich hoffe, dies hilft jemandem, hätte mir ein paar gerettet Stunden letzte Nacht)


4
Das ist ein sehr schlechter Versuch. Erstellen Sie einfach Stile für Ihre Schaltflächen, einen in den Werten 21, bei denen allCaps false ist. Wenn Sie auf ein älteres Thema zurückgreifen (hier ein Holo-Thema), wird Ihre App für den Benutzer hässlicher und inkonsistenter.
Bluewhile

2

Wenn Sie verwenden appcompat-v7, können Sie die Unterklasse AppCompatButtonund setSupportAllCaps(false)dann diese Klasse für alle Ihre Schaltflächen verwenden.

/**
 * Light extension of {@link AppCompatButton} that overrides ALL CAPS transformation
 */
public class Button extends AppCompatButton {
    public Button(Context context, AttributeSet attrs) {
        super(context, attrs);
        setSupportAllCaps(false);
    }

    public Button(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setSupportAllCaps(false);
    }
}

Siehe AppCompatButton # setSupportAllCaps (boolean) Android-Dokumente.


2

Standardmäßig bietet Button in Android das Schlüsselwort all caps. Wenn Sie möchten, dass der Schaltflächentext in Klein- oder Großbuchstaben geschrieben wird, können Sie das textAllCapsFlag mit deaktivierenandroid:textAllCaps="false"


0

Ich weiß nicht, warum die Antwort von @ user1010160 mit 0 bewertet wurde. Ich hätte sie mit +1 bewertet, wenn ich genug Ruf gehabt hätte.

Da meine App für eine API unter 14 ausgelegt ist und ich meinem Programm keinen Code hinzufügen wollte, fand ich keine Lösung, bis ich seine Antwort gelesen hatte. Was er sagte war, dass, obwohl Sie getan haben, was in den Anwendungsstilen benötigt wird, es nicht funktionieren wird, es sei denn, Sie fügen Ihrer Aktivität einen Stil hinzu und setzen dort textAllCaps auf false.

Es reicht nicht aus, einen Stil für die Aktivität zu haben (meine Aktivität hatte einen Stil), da der Stil möglicherweise standardmäßig die AllCaps-Eigenschaft verwendet. Sie müssen diese Eigenschaft auch in der Aktivität explizit auf false setzen.

Ich habe es jetzt sowohl in der Anwendung als auch in den Aktivitätsteilen der Manifestdatei.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.