为什么我的按钮文本在Lollipop系统中被强制转换为全大写?

501
在我的应用程序“Tide Now WA”中,我最近使用新的Nexus 9平板电脑(Lollipop-API 21)测试了兼容性。
它会写入一些按钮文本。该应用程序在Android 2.3和Android 4.0上正确地编写文本,即混合大写字母和小写字母。
当在我的Nexus 9上运行同一应用程序时,文本中的所有字母都是大写的。
顺便提一下,我的清单包含以下声明: uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14" 我能在我的代码中修复这个问题吗,还是这是操作系统中的一个错误?
谢谢

你能分享一段代码,展示如何混合使用大写和小写字母吗? - N Sharma
它们在我的strings.xml文件中定义,例如 <string name="r1s1">西雅图</string>。 - user1644002
还太早,打得不对。抱歉。 - user1644002
26
在使用 Material(或 API 21+ 中的 DeviceDefault)主题时,按钮文本默认为全大写。这是预期的工作方式。 - alanv
非常有用的问题。谢谢。 - Yi Xiang Chong
20个回答

714
我不知道为什么会发生这种情况,但有3个微不足道的尝试:
  1. 在你的 layout-v21 中使用 android:textAllCaps="false"

  2. 以编程方式更改按钮的转换方法。 mButton.setTransformationMethod(null);

  3. 检查您的 Allcaps 样式

注意: public void setAllCaps(boolean allCaps)android:textAllCaps 可在 API 版本14及以上 available

2
是的,添加这个:btn[i].setTransformationMethod(null); 让它工作了,谢谢。 - user1644002
2
我接受Nikola的答案作为解决方案,但是我想指出问题的另一部分是由alanv提供的,他在上面的评论中解释了原因。 - user1644002
1
对我也起作用了,我使用了编程方法,因为textAllCaps XML属性仅支持API> 14。谢谢! - patrickjason91
3
我在我的样式定义中使用了 <item name="android:textAllCaps">false</item> - Someone Somewhere
将其直接添加到按钮的xml中时,可以完美地工作。 - Bimde
显示剩余3条评论

179

这是我在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
对于 API 级别低于 14 的支持,您可以使用 <item name="textAllCaps">false</item> - CommonsWare
这仅适用于 Widget.AppCompat.Button。更一般的答案由Ashish Chaugule在下面给出,即在主题样式中直接添加<item name="android:textAllCaps">false</item>。(尽管最初的问题是特别针对按钮提出的,但我认为如果不想要buttons的全部大写,则菜单项、操作等也不应该全部大写。) - user2808624
1
对我没有起作用,当我把 buttonStyle 改为 android:buttonStyle 时就开始工作了。 - Vasily Kabunov
2
在 XML 中,android:textAllCaps="false"(我正在使用 Android Studio 3.0)。 - meyasir

111

可以通过设置按钮的TransformationMethod属性,在应用程序代码中解决这个问题,例如:

mButton.setTransformationMethod(null);

1
对于 Kotlin,语法如下:mButton.transformationMethod = null。 - Native_Mobile_Arch_Dev

71

设置android:textAllCaps="false"。如果您使用的是appcompat样式,请确保textAllCaps出现在样式之前,否则样式将覆盖它。例如:

android:textAllCaps="false"
style="@style/Base.TextAppearance.AppCompat"

运行得很好,但在我的情况下,我必须这样做:<style name="textAppearanceButton" parent="@android:style/TextAppearance.Material.Widget.Button"> <item name="android:textAllCaps">false</item> </style> - Vfleitao

62

在样式中添加此行

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


57
我不知道为什么他们会把这个设为默认选项。 - Glenn Maynard
5
这是Material主题的默认设置,因为它符合Material设计的本质。 - QAMAR
穷人被困在物料设计的方框中。 - eric

39

这个方法是有效的...只需在你底部的代码中添加这段代码:

android:textAllCaps="false"

它应该停用大写字母,这样您就可以输入小写字母。


34

在您的XML中使用此行 android:textAllCaps="false"

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

1
非常有用的答案。谢谢。 - Yi Xiang Chong

33

在Lollipop中,默认是使用"textAllCaps true"的,因此您需要手动将其改为false。


6
知道这个真是太好了。有没有一个网站列出每个Android版本的所有默认值? - Adam

25

<Button> 标签中添加 android:textAllCaps="false" 即可。


23

有一种更简单的方法适用于所有按钮,只需在您的主题中更改按钮的外观,尝试以下操作:

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>

提示:建议遵循 Material Design 的原则,您应该在按钮中显示大写文本,http://www.google.com/design/spec/components/buttons.html


2
我同意,遵循设计准则是很好的...直到按钮文本不再适合按钮。 - Someone Somewhere
谷歌应该停止谈论样式——我不知道有人因为小写按钮而在街上哭泣和呜咽! - bharal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接