Por que o texto do meu botão é forçado a ALL CAPS no Lollipop?

447

No meu aplicativo "Tide Now WA", que testei recentemente quanto à compatibilidade usando o novo tablet Nexus 9 (Lollipop - API 21).

Ele escreve algum texto do botão. Este aplicativo grava o texto corretamente usando o Android 2.3 e o Android 4.0. Ou seja, capital misto e letras minúsculas.

Quando o mesmo aplicativo é executado no meu Nexus 9, todas as letras do texto são maiúsculas.

FWIW meu manifesto contém a seguinte declaração:

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

Posso corrigir isso no meu código ou é um bug no sistema operacional, graças

user1644002
fonte
Você pode compartilhar um código como você misturar letras maiúsculas e minúsculas
N Sharma
eles são definidos no meu strings.xml, como <string name = "r1s1"> Seattle </string>
user1644002 16/16
sim. 21. muito cedo para digitar certo. Desculpe
user1644002
23
O texto do botão está em maiúsculas por padrão ao usar o tema Material (ou DeviceDefault with API 21+). Isso está funcionando como pretendido.
alanv

Respostas:

636

Eu não tenho idéia do por que isso está acontecendo, mas há três tentativas triviais para fazer:

  1. Use android:textAllCaps="false"em seulayout-v21

  2. Altere programaticamente o método de transformação do botão. mButton.setTransformationMethod(null);

  3. Verifique seu estilo para Allcaps

Nota : public void setAllCaps(boolean allCaps), android:textAllCapsestão disponíveis a partir de API versão 14.

Nikola Despotoski
fonte
# 1 não fez diferença. Não sabe como fazer # 3, não tem estilos? Agora tentando # 2.
user1644002
2
sim, adicionando isso: btn [i] .setTransformationMethod (null); faz com que funcione graças
user1644002
2
Estou aceitando a resposta de Nikola como a solução, mas quero salientar que a outra parte das perguntas é a fornecida por alanv, que explicou o porquê nos comentários acima.
user1644002
1
Também funcionou para mim, usei o método programático, já que o textAllCaps XML attr é suportado apenas pela API> 14. obrigado!
patrickjason91
3
Eu usei <item name="android:textAllCaps">false</item>na minha definição de estilo
Alguém em algum lugar
169

Aqui está o que eu fiz em meus values ​​/ 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
fonte
8
Para suporte pré-API Nível 14, você pode usar <item name="textAllCaps">false</item>.
CommonsWare
Isso se aplica apenas ao Widget.AppCompat.Button. A resposta mais geral é dada por Ashish Chaugule abaixo, ou seja, adicionando diretamente <item name = "android: textAllCaps"> false </item> ao estilo do tema. (Embora as perguntas foi originalmente pediu especialmente para botões, acho que se Allcaps não é desejado para os botões, também não é desejado para os itens do menu, ações, etc.)
user2808624
1
Não funcionou para mim. Começou a trabalhar quando mudei buttonStyleparaandroid:buttonStyle
Vasily Kabunov
2
Em XML android:textAllCaps="false"(estou usando o estúdio do android 3.0)
meyasir
107

Isso pode ser corrigido no código do aplicativo, definindo o TransformationMethod do botão, por exemplo

mButton.setTransformationMethod(null);
user1644002
fonte
Para Kotlin, a sintaxe é: mButton.transformationMethod = null
Native_Mobile_Arch_Dev
66

Defina android: textAllCaps = "false". Se você estiver usando um estilo appcompat, verifique se textAllCaps vem antes do estilo. Caso contrário, o estilo o substituirá. Por exemplo:

android:textAllCaps="false"
style="@style/Base.TextAppearance.AppCompat"
Bob bobbington
fonte
Funcionou como um encanto, mas no meu caso eu tinha que fazer o seguinte: <style name = "textAppearanceButton" parent = "@ android: style / TextAppearance.Material.Widget.Button"> <item do item = "android: textAllCaps"> false < / item> </style>
Vfleitao 14/10
58

adicione esta linha com estilo

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

Ashish Chaugule
fonte
52
Eu não sei por que eles fazem isso o padrão
Glenn Maynard
5
Este é padrão no tema material, como ele se adapte natureza do material de concepção
Qamar
pessoas pobres preso na caixa quadrado de material de concepção
eric
35

este está funcionando .... apenas no seu código no seu código inferior adicione este:

android:textAllCaps="false"

ele deve desativar a letra maiúscula que você está tentando digitar pequena.

parsa sarshar
fonte
32

O padrão Lollipop vem com "textAllCaps true", então você deve manualmente torná-lo false

tharinduNA
fonte
5
É ótimo saber disso. Se houver um site que lista todos esses valores padrão por versão do Android?
Adam
23

Adicione android: textAllCaps = "false" na <Button>tag, é isso.

rajlaxmi_jagdale
fonte
19

Existe uma maneira mais fácil que funciona para todos os botões, basta alterar a aparência dos botões no seu tema, tente o seguinte:

em 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: é recomendável seguir os princípios do design do material. Você deve exibir texto em maiúsculas em Buttons, http://www.google.com/design/spec/components/buttons.html

pedroca
fonte
2
Eu concordo, é ótimo seguir as diretrizes de design ... até que o texto do botão não se encaixe mais no botão
Someone Somewhere
o google deveria parar de falar sobre estilos - eu não sabia que havia pessoas chorando e chorando nas ruas por causa de botões em minúsculas!
precisa saber é
11

Usar o android.support.v7.widget.AppCompatButton no layout XML permitirá evitar a necessidade de ter um layout-21 ou alterar programaticamente qualquer coisa. Naturalmente, isso também funcionará com a biblioteca 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"/>

Espero que isto ajude.

user2288580
fonte
11

Use esta linha android: textAllCaps = "false" no seu 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
fonte
9

No Android Studio IDE, você deve clicar no ícone Filtro para mostrar propriedades especializadas. Então você verá a textAllCapspropriedade. Verifique e desmarque.

wisbucky
fonte
9

Você pode adicionar android:textAllCaps="false"ao botão.

O texto do botão pode ser transformado em maiúscula pelo tema do seu aplicativo que se aplica a todos os botões. Verifique os arquivos de temas / estilos para definir o atributo android:textAllCaps.

chakri Reddy
fonte
9

Java:

yourButton.setAllCaps(false);

Kotlin:

yourButton.isAllCaps = false

XML:

android:textAllCaps="false"

Estilos:

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

No layout:

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

Se você chegou aqui porque o texto do botão do Facebook aparece em maiúsculas, basta adicioná-lo android:textAllCaps="false"ao seu arquivo xml. Funcionou para mim.

Mightian
fonte
2

OK, apenas encontrei isso. Os botões no Lollipop saem em maiúsculas E a fonte é redefinida para 'normal'. Mas no meu caso (Android 5.02), ele estava funcionando em um layout corretamente, mas não em outro !?

Alterar APIs não funcionou.
A configuração para todos os limites requer API mínima 14 e a fonte ainda é redefinida para 'normal'.

É porque o Android Material Styles força uma alteração nos estilos se não houver um definido (é por isso que funcionou em um dos meus layouts e não no outro porque eu defini um estilo).

Portanto, a solução mais fácil é definir um estilo no manifesto para cada atividade que, no meu caso, era apenas:
android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen"
(espero que isso ajude alguém, teria me poupado um par de horas na noite passada)

user1010160
fonte
4
Essa é uma tentativa muito ruim, basta criar estilos para seus botões, um em valores-21 que tenha allCaps false. Voltar a um tema mais antigo (aqui um Tema Holo) torna seu aplicativo mais feio e mais inconsistente para o usuário.
bluewhile
2

Se você usar appcompat-v7, poderá subclassificar AppCompatButtone setSupportAllCaps(false), em seguida, usar esta classe para todos os seus botões.

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

Consulte AppCompatButton # setSupportAllCaps (booleano) documentos do Android.

hidro
fonte
2

Por padrão, o botão no Android fornece todas as palavras-chave em maiúsculas. Se quiser que o texto do botão esteja em minúsculas ou mistas, você pode desativar o textAllCapssinalizador usandoandroid:textAllCaps="false"

Reyaz Ahmad
fonte
0

Não sei por que a resposta de @ user1010160 obteve classificação 0. Eu teria dado +1 se tivesse reputação suficiente.

Como meu aplicativo foi desenvolvido para API com menos de 14 anos e eu não queria adicionar código ao meu programa, não encontrei uma solução até ler sua resposta. O que ele disse foi que, mesmo que você tenha feito o necessário nos estilos de aplicativo, ele não funcionará, a menos que você adicione um estilo à sua atividade e defina textAllCaps como false.

Não é suficiente ter um estilo para a atividade (minha atividade tinha um estilo), porque o estilo pode ter como padrão a propriedade AllCaps. Você deve definir explicitamente, também na atividade, essa propriedade como false.

Agora eu tenho isso nas partes Aplicativo e Atividade do arquivo de manifesto.

Zvi
fonte
0

Outra alternativa programática do Kotlin:

mButton.transformationMethod = null

Native_Mobile_Arch_Dev
fonte