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

user1644002
quelle
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.

Nikola Despotoski
quelle
# 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>
Miguel
quelle
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);
user1644002
quelle
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"
Bob Bobbington
quelle
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>

Ashish Chaugule
quelle
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.

Parsa Sarshar
quelle
32

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

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

Fügen Sie android: textAllCaps = "false" in <Button>Tag, das es ist.

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

pedroca
quelle
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.

user2288580
quelle
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"
           />
Abdul Basit Rishi
quelle
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.

wisbucky
quelle
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.

Chakri Reddy
quelle
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"
      .
      .
   />
Amir Hossein Ghasemi
quelle
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.

Mightian
quelle
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)

user1010160
quelle
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.

Hidro
quelle
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"

Reyaz Ahmad
quelle
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.

Zvi
quelle
0

Eine weitere programmatische Kotlin-Alternative:

mButton.transformationMethod = null

Native_Mobile_Arch_Dev
quelle