¿Por qué se fuerza el texto de mi Botón a TODAS LAS MAYÚSCULAS en Lollipop?

447

En mi aplicación "Tide Now WA", que recientemente probé para compatibilidad usando la nueva tableta Nexus 9 (Lollipop - API 21).

Escribe un texto de botón. Esta aplicación escribe el texto correctamente con Android 2.3 y Android 4.0. Es decir, letras mayúsculas y minúsculas mixtas.

Cuando se ejecuta la misma aplicación en mi Nexus 9, todas las letras del texto aparecen en mayúscula.

FWIW mi manifiesto contiene la siguiente declaración:

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

¿Puedo arreglar esto en mi código o es un error en el sistema operativo gracias

usuario1644002
fuente
¿Puedes compartir un código? ¿Cómo combinaste mayúsculas y minúsculas?
N Sharma
se definen en mi strings.xml como <string name = "r1s1"> Seattle </string>
user1644002
si. 21. demasiado temprano para escribir a la derecha. Lo sentimos
usuario 1644002
23
El texto del botón es todo en mayúsculas de forma predeterminada cuando se usa el tema Material (o DeviceDefault con API 21+). Esto está funcionando según lo previsto.
alanv

Respuestas:

636

No tengo idea de por qué está sucediendo, pero hay 3 intentos triviales de hacer:

  1. Uso android:textAllCaps="false"en sulayout-v21

  2. Cambie programáticamente el método de transformación del botón. mButton.setTransformationMethod(null);

  3. Comprueba tu estilo para Allcaps

Nota : public void setAllCaps(boolean allCaps), android:textAllCapsestán disponibles desde la versión de la API 14.

Nikola Despotoski
fuente
# 1 no hizo ninguna diferencia. ¿No estás seguro de cómo hacer # 3, no tienes estilos? Ahora intentando # 2.
user1644002
2
sí, agregando esto: btn [i] .setTransformationMethod (nulo); lo hace funcionar gracias
user1644002
2
Acepto la respuesta de Nikola como la solución, pero quiero señalar que la otra parte de las preguntas es la proporcionada por alanv, quien explicó el por qué en los comentarios anteriores.
user1644002
1
También funcionó para mí, utilicé el método programático ya que textAllCaps XML attr solo es compatible con API> 14. ¡gracias!
patrickjason91
3
Utilicé <item name="android:textAllCaps">false</item>en mi definición de estilo
alguien en algún lugar el
169

Esto es lo que hice en my 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
fuente
8
Para el soporte previo al API Nivel 14, puede usar <item name="textAllCaps">false</item>.
CommonsWare
Esto solo se aplica a Widget.AppCompat.Button. Ashish Chaugule da la respuesta más general a continuación, es decir, agregar directamente <item name = "android: textAllCaps"> false </item> al estilo del tema. (Aunque las preguntas se hicieron originalmente especialmente para botones, creo que si allCaps no se desea para botones, tampoco se desea para elementos de menú, acciones, etc.)
user2808624
1
No funciono para mi. Empecé a trabajar cuando me cambié buttonStyleaandroid:buttonStyle
Vasily Kabunov
2
En XML android:textAllCaps="false"(estoy usando android studio 3.0)
meyasir
107

Esto se puede corregir en el código de la aplicación configurando el Método de transformación del botón, p. Ej.

mButton.setTransformationMethod(null);
usuario1644002
fuente
Para Kotlin, la sintaxis es: mButton.transformationMethod = null
Native_Mobile_Arch_Dev
66

Establezca android: textAllCaps = "false". Si está utilizando un estilo appcompat, asegúrese de que textAllCaps esté antes del estilo. De lo contrario, el estilo lo anulará. Por ejemplo:

android:textAllCaps="false"
style="@style/Base.TextAppearance.AppCompat"
Bob bobbington
fuente
Funcionó de maravilla, pero en mi caso tuve que hacer como: <style name = "textAppearanceButton" parent = "@ android: style / TextAppearance.Material.Widget.Button"> <item name = "android: textAllCaps"> false < / item> </style>
Vfleitao
58

agrega esta línea con estilo

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

Ashish Chaugule
fuente
52
NO SÉ POR QUÉ HICIERON ESTO ES EL PREDETERMINADO
Glenn Maynard
55
Este es el tema predeterminado del material, ya que se adapta a la naturaleza del diseño del material
QAMAR
pobres atrapados en la caja cuadrada de diseño de materiales
eric
35

este está funcionando ... solo en su código en su código inferior agregue este:

android:textAllCaps="false"

debería desactivar la letra mayúscula que U intenta escribir en letra pequeña.

parsa sarshar
fuente
32

El valor predeterminado de Lollipop viene con "textAllCaps true", por lo que debe convertirlo en falso manualmente

tharinduNA
fuente
55
Eso es genial saberlo. Si hay un sitio que enumera todos estos valores predeterminados por versión de Android?
Adam
23

Agregue android: textAllCaps = "false" en la <Button>etiqueta que es eso.

rajlaxmi_jagdale
fuente
19

Hay una manera más fácil que funciona para todos los botones, solo cambie la apariencia de los botones en su tema, intente esto:

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

PD: se recomienda seguir los principios de diseño de materiales, debe mostrar texto en mayúsculas en Botones, http://www.google.com/design/spec/components/buttons.html

pedroca
fuente
2
Estoy de acuerdo, es genial seguir las pautas de diseño ... hasta que el texto del botón ya no entre en el botón
Someone Somewhere
Google debería dejar de hablar de estilos: ¡no sabía que había gente llorando y sollozando en las calles debido a los botones en minúsculas!
bharal
11

El uso de android.support.v7.widget.AppCompatButton en el diseño XML le permitirá evitar tener que tener un diseño 21 o cambiar algo programáticamente. Naturalmente, esto también funcionará con la 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 esto ayude.

usuario2288580
fuente
11

Utilice esta línea android: textAllCaps = "false" en su 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
fuente
9

En Android Studio IDE, debe hacer clic en el icono Filtro para mostrar propiedades expertas. Luego verá la textAllCapspropiedad. Verifíquelo, luego desactívelo.

wisbucky
fuente
9

Podrías agregar android:textAllCaps="false"al botón.

El texto del botón puede transformarse a mayúsculas por el tema de su aplicación que se aplica a todos los botones. Verifique los archivos de temas / estilos para configurar el atributo android:textAllCaps.

chakri Reddy
fuente
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>

En diseño:

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

Si ha llegado aquí porque el texto de su botón de Facebook aparece en mayúsculas, simplemente agregue esto android:textAllCaps="false"en su archivo xml. Funcionó para mi.

Mightian
fuente
2

OK, acabo de encontrarme con esto. Los botones en Lollipop salen en mayúsculas Y la fuente se restablece a 'normal'. ¿Pero en mi caso (Android 5.02) funcionaba correctamente en un diseño, pero no en otro?

El cambio de API no funcionó.
La configuración en mayúsculas requiere una API 14 mínima y la fuente aún se restablece a 'normal'.

Se debe a que los Estilos de material de Android fuerzan un cambio en los estilos si no hay uno definido (es por eso que funcionó en uno de mis diseños y no en el otro porque definí un estilo).

Entonces, la solución fácil es definir un estilo en el manifiesto para cada actividad que en mi caso fue simplemente:
android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen"
(espero que esto ayude a alguien, me habría ahorrado un par de horas anoche)

usuario1010160
fuente
44
Es un intento muy malo, solo crea estilos para tus botones, uno en valores-21 que tenga todas las mayúsculas falsas. Volver a un tema anterior (aquí un tema Holo) hace que su aplicación sea más fea e inconsistente para el usuario.
bluewhile
2

Si lo usa appcompat-v7, puede subclasificar AppCompatButtony setSupportAllCaps(false)luego usar esta clase para todos sus botones.

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

Ver AppCompatButton # setSupportAllCaps (boolean) documentos de Android.

hidro
fuente
2

De forma predeterminada, Button en Android proporciona todas las palabras clave mayúsculas. Si desea que el texto del botón esté en minúsculas o en mayúsculas, puede deshabilitar la textAllCapsmarca usandoandroid:textAllCaps="false"

Reyaz Ahmad
fuente
0

No sé por qué la respuesta de @ user1010160 obtuvo una calificación de 0. Le hubiera dado +1 si tuviera suficiente reputación.

Como mi aplicación está diseñada para API menores de 14 y no quería agregar código a mi programa, no encontré una solución hasta que leí su respuesta. Lo que dijo fue que, aunque haya hecho lo que se necesita en los estilos de la Aplicación, no funcionará a menos que agregue un estilo a su actividad y establezca textAllCaps en falso.

No es suficiente tener un estilo para la actividad (mi actividad tenía un estilo), porque el estilo puede ser el valor predeterminado de la propiedad AllCaps. Debe establecer explícitamente, también en la actividad, esa propiedad en falso.

Ahora lo tengo tanto en la aplicación como en las partes de actividad del archivo de manifiesto.

Zvi
fuente
0

Otra alternativa programática de Kotlin:

mButton.transformationMethod = null

Native_Mobile_Arch_Dev
fuente