Pourquoi le texte de mon bouton est-il forcé à TOUTES MAJUSCULES sur Lollipop?

448

Dans mon application "Tide Now WA" dont j'ai récemment testé la compatibilité avec la nouvelle tablette Nexus 9 (Lollipop - API 21).

Il écrit du texte de bouton. Cette application écrit le texte correctement en utilisant Android 2.3 et Android 4.0. C'est à dire des lettres majuscules et minuscules mixtes.

Lorsque la même application est exécutée sur mon Nexus 9, toutes les lettres du texte sont en majuscules.

Mon manifeste FWIW contient la déclaration suivante:

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

Puis-je résoudre ce problème dans mon code ou est-ce un bug dans le système d'exploitation merci

user1644002
la source
Pouvez-vous partager un code comment avez-vous mélangé les majuscules et les minuscules
N Sharma
ils sont définis dans mon strings.xml tels que <string name = "r1s1"> Seattle </string>
user1644002
Oui. 21. trop tôt pour taper à droite. Désolé
user1644002
23
Le texte du bouton est entièrement en majuscules par défaut lors de l'utilisation du thème Matériau (ou DeviceDefault avec API 21+). Cela fonctionne comme prévu.
alanv

Réponses:

637

Je ne sais pas pourquoi cela se produit mais il y a 3 tentatives triviales à faire:

  1. Utilisez android:textAllCaps="false"dans votrelayout-v21

  2. Modifiez par programme la méthode de transformation du bouton. mButton.setTransformationMethod(null);

  3. Vérifiez votre style pour Allcaps

Remarque : public void setAllCaps(boolean allCaps), android:textAllCapssont disponibles à partir de la version de l' API 14.

Nikola Despotoski
la source
# 1 n'a fait aucune différence. Vous ne savez pas comment faire # 3, vous n'avez pas de styles? Essayez maintenant # 2.
user1644002
2
oui, en ajoutant ceci: btn [i] .setTransformationMethod (null); ça marche grâce
user1644002
2
J'accepte la réponse de Nikola comme solution, mais je tiens à souligner que l'autre partie des questions est celle fournie par alanv, qui a expliqué pourquoi dans les commentaires ci-dessus.
user1644002
1
A également fonctionné pour moi, a utilisé la méthode de programmation, car textAllCaps XML attr est uniquement pris en charge API> 14. merci!
patrickjason91
3
J'ai utilisé <item name="android:textAllCaps">false</item>dans ma définition de style
Someone Somewhere
169

Voici ce que j'ai fait dans mes valeurs / themes.xml

    <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
la source
8
Pour la prise en charge pré-API de niveau 14, vous pouvez utiliser <item name="textAllCaps">false</item>.
CommonsWare
Cela s'applique uniquement à Widget.AppCompat.Button. La réponse plus générale est donnée par Ashish Chaugule ci-dessous, c'est-à-dire en ajoutant directement <item name = "android: textAllCaps"> false </item> au style du thème. (Bien que les questions aient été initialement posées en particulier pour les boutons, je pense que si allCaps n'est pas souhaité pour les boutons, il n'est pas non plus souhaité pour les éléments de menu, les actions, etc.)
user2808624
1
Ça n'a pas marché pour moi. Je suis devenu au travail quand j'ai changé buttonStylepourandroid:buttonStyle
Vasily Kabunov
2
En XML android:textAllCaps="false"(j'utilise Android Studio 3.0)
meyasir
107

Ceci peut être corrigé dans le code de l'application en définissant la méthode de transformation du bouton, par exemple

mButton.setTransformationMethod(null);
user1644002
la source
Pour Kotlin, la syntaxe est: mButton.transformationMethod = null
Native_Mobile_Arch_Dev
66

Définissez android: textAllCaps = "false". Si vous utilisez un style compatible avec les applications, assurez-vous que textAllCaps précède le style. Sinon, le style le remplacera. Par exemple:

android:textAllCaps="false"
style="@style/Base.TextAppearance.AppCompat"
Bob bobbington
la source
A fonctionné comme un charme mais sur mon cas, je devais faire comme: <style name = "textAppearanceButton" parent = "@ android: style / TextAppearance.Material.Widget.Button"> <item name = "android: textAllCaps"> false < / item> </style>
Vfleitao
58

ajoutez cette ligne avec style

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

Ashish Chaugule
la source
53
JE NE SAIS PAS POURQUOI ILS FERAIENT CE PAR DÉFAUT
Glenn Maynard
5
C'est le thème par défaut du matériau, car il convient à la nature de la conception matérielle
QAMAR
les pauvres coincés dans la boîte carrée de la conception matérielle
eric
35

celui-ci fonctionne .... juste dans votre code dans votre code inférieur ajoutez celui-ci:

android:textAllCaps="false"

cela devrait désactiver la lettre majuscule que U essaye de taper petit.

parsa sarshar
la source
32

La valeur par défaut de Lollipop est fournie avec "textAllCaps true", vous devez donc manuellement la rendre fausse

tharinduNA
la source
5
C'est super à savoir. S'il existe un site qui répertorie toutes ces valeurs par défaut par version Android?
Adam
23

Ajoutez android: textAllCaps = "false" dans la <Button>balise c'est tout.

rajlaxmi_jagdale
la source
19

Il existe un moyen plus simple qui fonctionne pour tous les boutons, changez simplement l'apparence des boutons dans votre thème, essayez ceci:

dans 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: il est recommandé de suivre les principes de la conception matérielle, vous devez afficher le texte en majuscule dans les boutons, http://www.google.com/design/spec/components/buttons.html

pedroca
la source
2
Je suis d'accord, c'est génial de suivre les directives de conception ... jusqu'à ce que le texte du bouton ne tienne plus dans le bouton
Quelqu'un Quelque part
Google devrait juste arrêter de parler de styles - je ne savais pas qu'il y avait des pleurs et des sanglots dans les rues à cause des boutons en minuscules!
bharal
11

L'utilisation de android.support.v7.widget.AppCompatButton dans la disposition XML vous permettra d'éviter d'avoir à avoir une disposition-21 ou de changer quoi que ce soit par programme. Naturellement, cela fonctionnera également avec la bibliothèque AppCompat v7.

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

J'espère que cela t'aides.

user2288580
la source
11

Utilisez cette ligne android: textAllCaps = "false" dans votre 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
la source
9

Dans Android Studio IDE, vous devez cliquer sur l'icône Filtre pour afficher les propriétés expertes. Ensuite, vous verrez la textAllCapspropriété. Vérifiez-le, puis décochez-le.

wisbucky
la source
9

Vous pourriez ajouter android:textAllCaps="false" au bouton.

Le texte du bouton peut être transformé en majuscule par le thème de votre application qui s'applique à tous les boutons. Vérifiez les fichiers de thèmes / styles pour définir l'attribut android:textAllCaps.

chakri Reddy
la source
9

Java:

yourButton.setAllCaps(false);

Kotlin:

yourButton.isAllCaps = false

XML:

android:textAllCaps="false"

Modes:

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

Dans la mise en page:

   <Button
      .
      .
      style="@style/yourButtonStyle"
      .
      .
   />
Amir Hossein Ghasemi
la source
4

Si vous êtes arrivé ici parce que le texte de votre bouton facebook apparaît dans toutes les majuscules, ajoutez-le simplement android:textAllCaps="false"dans votre fichier xml. Ça a marché pour moi.

Mightian
la source
2

OK, je suis juste tombé sur ça. Les boutons de Lollipop sont tous en majuscules ET la police est réinitialisée à «normal». Mais dans mon cas (Android 5.02), cela fonctionnait correctement dans une disposition, mais pas dans une autre!?

La modification des API n'a pas fonctionné.
La définition de toutes les majuscules nécessite min API 14 et la police est toujours réinitialisée à «normal».

C'est parce que les styles de matériaux Android obligent à modifier les styles s'il n'y en a pas un défini (c'est pourquoi cela a fonctionné dans l'une de mes dispositions et pas dans l'autre parce que j'ai défini un style).

Donc, la solution facile consiste à définir un style dans le manifeste pour chaque activité qui, dans mon cas, était simplement:
android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen"
(j'espère que cela aide quelqu'un, cela m'aurait sauvé un couple d'heures hier soir)

user1010160
la source
4
C'est une très mauvaise tentative, créez simplement des styles pour vos boutons, un dans values-21 qui a allCaps false. Revenir à un thème plus ancien (ici un thème Holo) rend votre application plus laide et plus incohérente pour l'utilisateur.
bleu pendant
2

Si vous utilisez appcompat-v7, vous pouvez sous -classer AppCompatButtonet setSupportAllCaps(false)ensuite utiliser cette classe pour tous vos boutons.

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

Voir AppCompatButton # setSupportAllCaps (booléen) documents Android.

hidro
la source
2

Par défaut, Button dans Android fournit tous les mots clés en majuscules. Si vous souhaitez que le texte du bouton soit en minuscules ou en majuscules, vous pouvez désactiver l' textAllCapsindicateur à l'aide deandroid:textAllCaps="false"

Reyaz Ahmad
la source
0

Je ne sais pas pourquoi la réponse de @ user1010160 a obtenu une note de 0. Je l'aurais donné +1 si j'avais suffisamment de réputation.

Étant donné que mon application est conçue pour une API inférieure à 14 et que je ne voulais pas ajouter de code à mon programme, je n'ai trouvé aucune solution avant d'avoir lu sa réponse. Ce qu'il a dit, c'est que même si vous avez fait ce qui est nécessaire dans les styles d'application, cela ne fonctionnera que si vous ajoutez un style à votre activité et que vous définissez textAllCaps sur false.

Il ne suffit pas d'avoir un style pour l'activité (mon activité avait un style), car le style peut par défaut être la propriété AllCaps. Vous devez définir explicitement, dans l'activité également, cette propriété sur false.

Je l'ai maintenant à la fois dans l'application et dans les parties d'activité du fichier manifeste.

Zvi
la source
0

Une autre alternative programmatique de Kotlin:

mButton.transformationMethod = null

Native_Mobile_Arch_Dev
la source