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


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.


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

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

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"

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>


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.


32

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


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


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


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.


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

9

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


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.


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

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.


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)


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.


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"


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.